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++ OpenMP简单介绍

    C++ OpenMP简单介绍

    这篇文章主要介绍了C++ OpenMP简介,OpenMP 还支持自定义数据类型的归约操作,需要通过omp declare reduction指令来声明自定义操作符和数据类型的归约方式,感兴趣的朋友一起看看吧
    2023-05-05
  • Qt中导航栏实现的详细指南

    Qt中导航栏实现的详细指南

    在现代的图形用户界面中,工具栏是提供快速访问常用功能和命令的重要组件,本文主要介绍了Qt中导航栏实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • 如何在c++中实现字符串分割函数split详解

    如何在c++中实现字符串分割函数split详解

    这篇文章主要给大家介绍了关于如何在c++中实现字符串分割函数split的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • C++中strlen(),sizeof()与size()的区别

    C++中strlen(),sizeof()与size()的区别

    本文主要介绍了C++中strlen(),sizeof()与size()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • VC++中HTControl控件类的CHTSlider控制杆控件类简介

    VC++中HTControl控件类的CHTSlider控制杆控件类简介

    这篇文章主要介绍了VC++中HTControl控件类的CHTSlider控制杆控件类,需要的朋友可以参考下
    2014-08-08
  • VSCode多根工作区功能实现

    VSCode多根工作区功能实现

    VSCode的多根工作区功能允许在一个窗口内同时处理多个文件夹,适用于前后端分离项目、Monorepo项目管理、微服务架构开发等场景,本文主要介绍了VSCode多根工作区功能实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-12-12
  • C++单一职责原则示例代码浅析

    C++单一职责原则示例代码浅析

    我们在设计一个类时要学会发现职责,并把那些职责相互分离,其实要去判断是否应该分离出一个类来并不难,前面说过,一个类应该只有一个引起它变化的原因,如果你能想到其它的原因也能去改变这个类,那么这个类就具有多于1个的职责,就应该考虑类的职责分离
    2023-02-02
  • 利用C语言替换文件中某一行的方法

    利用C语言替换文件中某一行的方法

    大家都知道C语言提供了文件操作,但是替换文件的某一行比较麻烦,下面是我使用的一个方法,现在分享给大家,有需要的朋友们可以参考借鉴。
    2016-09-09
  • C++继承介绍

    C++继承介绍

    C++继承可以是单一继承或多重继承,每一个继承连接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • OpenCV实现图像连通域

    OpenCV实现图像连通域

    这篇文章主要为大家详细介绍了OpenCV实现图像连通域,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论