C++面试八股文之static_cast你了解吗

 更新时间:2023年06月21日 08:40:24   作者:二进制架构  
C++11引入四种新的类型转换,分别是static_cast、dynamic_cast、const_cast、和reinterpret_cast,下面就来和大家讲讲static_cast中面试常考的知识点吧

某日二师兄参加XXX科技公司的C++工程师开发岗位第20面:

面试官:C++中支持哪些类型转换?

二师兄:C++支持C风格的类型转换,并在C++11引入新的关键字规范了类型转换。

二师兄:C++11引入四种新的类型转换,分别是static_castdynamic_castconst_cast、和reinterpret_cast

二师兄:static_cast用途最广泛,除了后面三种类型转换外,其他的类型转换都能使用static_cast完成。

二师兄:dynamic_cast主要用于运行时的从父类指针向子类指针转换,如果转换不成功则返回nullptr

#include <iostream>
struct Base
{
    virtual void fun() {}
};
struct Derived : public Base
{
    virtual void fun() override {}
};
int main(int argc, char const *argv[])
{
    Base* b1 = new Base;
    Base* b2 = new Derived;
    Derived* d1 = dynamic_cast<Derived*>(b1);	//d1 == nullptr
    Derived* d2 = dynamic_cast<Derived*>(b2);	//d2 != nullptr
}

二师兄:const_cast主要用于去除指针或引用类型的const属性。此操作可能会导致未定义的行为,所以需要慎用。

#include <iostream>
void function(const int& val)
{
    int& v = const_cast<int&>(val);
    v = 42;
}
int main(int argc, char const *argv[])
{
    int val = 1024;
    function(val);
    std::cout << val << std::endl;	//val == 42
}
//-----------------------------------------------
#include <iostream>
static constexpr int val_static = 1024;
void function(const int& val)
{
    int& v = const_cast<int&>(val);
    v = 42;
}
int main(int argc, char const *argv[])
{
    function(val_static);
    std::cout << val_static << std::endl;
}
// Segmentation fault

二师兄:reinterpret_cast可以将指针或引用转换为任何类型的指针或引用。reinterpret_cast实现依赖于编译器和硬件,可能导致未定义的行为。

#include <iostream>
int main(int argc, char const *argv[])
{
    int i = 42;
    double d = 42.0;
    long* l1 = reinterpret_cast<long*>(&i);
    long* l2 = reinterpret_cast<long*>(&d);
    std::cout << *l1 << std::endl;	//*i1 == 42
    std::cout << *l2 << std::endl;	//*i2 == 4631107791820423168 X86_64 GCC 11.3 
}

面试官:好的。既然已经有C风格的类型转换,C++11为什么还要引入新的类型转换关键字?

二师兄:主要有三点,更安全、更灵活、可读性更好。

面试官:知道什么是隐式转换吗?

二师兄:了解一些。隐式转换是指在表达式中自动进行的类型转换。比如int 和 double相加,会把int先转为double,然后再进行求和。

面试官:隐式转换有哪些优势和缺陷?

二师兄:隐式转换的优势是代码简洁。但是有很大缺陷,有些情况隐式转换的结果和程序员的意图不一致,会导致难以发现的问题。所以在实际项目中一般会添加编译选项-Werror=conversion来禁止隐式转换。

面试官:那你知道explicit关键字有什么作用吗?

二师兄:也是禁止隐式转换的一个方式:

struct Foo
{
    Foo(int i):val_(i){}
    int val_;
};
struct Goo
{
    explicit Goo(int i):val_(i){}
    int val_;
};
void function1(Foo f){}
void function2(Goo g){}
int main(int argc, char const *argv[])
{
    Foo f = 1024;	//编译通过,可以把int类型转换成Foo
    Goo g = 1024;   //编译失败,不能把int类型转换成Goo
    function1(42);  //编译通过,可以把int类型转换成Foo
    function2(42);  //编译失败,不能把int类型转换成Goo
}

面试官:如何把一个自定义类型转换成一个int类型?

二师兄:需要重载operator int()运算符:

#include <iostream>
struct Foo
{
    Foo(double d):val_(d){}
    double val_;
    explicit operator int(){
        return static_cast<int>(val_);
    }
};
int main(int argc, char const *argv[])
{
    Foo f(42.5);
    int i = static_cast<int>(f);
    std::cout << i << std::endl;	//i == 42
}

面试官:好的,回去等消息吧。

到此这篇关于C++面试八股文之static_cast你了解吗的文章就介绍到这了,更多相关C++ static_cast内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言数据在内存中的存储流程深入分析

    C语言数据在内存中的存储流程深入分析

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-10-10
  • C++实践数组类运算的实现参考

    C++实践数组类运算的实现参考

    今天小编就为大家分享一篇关于C++实践数组类运算的实现参考,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C++可以函数重载而C不可以的原因分析

    C++可以函数重载而C不可以的原因分析

    函数重载是指在同一个作用域内,可以定义多个函数,它们具有相同的名称但是参数列表不同,为什么C++可以函数重载而C不可以,接下来就有小编来给大家介绍一下C++可以函数重载而C不可以的原因,需要的朋友可以参考下
    2023-12-12
  • c语言中unsigned修饰符的使用

    c语言中unsigned修饰符的使用

    在C语言中,unsigned是一种无符号整数修饰符,本文主要介绍了c语言中unsigned修饰符的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Qt 实现钢笔画线效果示例及详细原理

    Qt 实现钢笔画线效果示例及详细原理

    这篇文章主要介绍了Qt 实现钢笔画线效果示例及详细原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C语言 指针的初始化赋值案例详解

    C语言 指针的初始化赋值案例详解

    这篇文章主要介绍了C语言 指针的初始化赋值案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言动态与静态分别实现通讯录详细过程

    C语言动态与静态分别实现通讯录详细过程

    这篇文章主要为大家介绍了C语言动态与静态分别实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 关于C++函数模版的实现讲解

    关于C++函数模版的实现讲解

    今天小编就为大家分享一篇关于关于C++函数模版的实现讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言 变量详解及示例代码

    C语言 变量详解及示例代码

    本文主要介绍C语言 变量,这里整理了C语言 变量的基础知识,并附有示例代码和详细讲解,希望能帮助学习C语言的朋友
    2016-08-08
  • C语言实现职工管理系统

    C语言实现职工管理系统

    这篇文章主要为大家详细介绍了C语言实现职工管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11

最新评论