首页 > 编程语言 >C++面试八股文:static_cast了解一下?

C++面试八股文:static_cast了解一下?

时间:2023-06-20 23:34:06浏览次数:51  
标签:类型转换 const val int C++ cast static

某日二师兄参加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为什么还要引入新的类型转换关键字?

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

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

二师兄:了解一些。隐式转换是指在表达式中自动进行的类型转换。比如intdouble相加,会把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++面试之旅,明天继续。

关注我,带你21天“精通”C++!(狗头)

标签:类型转换,const,val,int,C++,cast,static
From: https://www.cnblogs.com/binarch/p/17495144.html

相关文章

  • C++面试八股文:static_cast了解一下?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第20面:面试官:C++中支持哪些类型转换?二师兄:C++支持C风格的类型转换,并在C++11引入新的关键字规范了类型转换。二师兄:C++11引入四种新的类型转换,分别是static_cast、dynamic_cast、const_cast、和reinterpret_cast。二师兄:static_ca......
  • C++ 智能指针
    unique_ptrunique_ptr为了避免重复释放(doublefree)问题出现,进行拷贝(删除了拷贝构造函数)这样的特性带来的问题是无法进行参数传递(因为参数传递需要拷贝构造函数),有两种解决方法想要解决这个问题,首先需要理解为什么unique_ptr会禁止拷贝,对一个指针进行拷贝......
  • 《C++》文件操作
    C++本地文件读写引用头文件<fstream>操作文件三大类ofstream:写操作ifstream:读操作fstream:读写操作打开方式解释ios::in读ios::out写ios::ate初始位置:文件尾ios::app追加方式写文件ios::trunc如果文件存在先删除在创建ios::binary二进制方式PS:文件打开方式可以配合使用,利用“|”......
  • C++ 41-60
    ......
  • 多路Qt串口通信源码C++语言接口自定义协议帧Qt读写配置文件ini出售: 可变长定长通信接
    多路Qt串口通信源码C++语言接口自定义协议帧Qt读写配置文件ini出售:可变长定长通信接口协议实现Qt多路串口发送接收SerialProtocol.rar工控自定义报文可用于嵌入式,单片机,ARM,DSP等常见的串口通信中,出售在应用实践中编写总结的源代码,实现自定义的串口通信协议,包括报文头部、长度......
  • C++输入输出流
    一、输入输出流三种流:istream、ostream、iostream标准输入输出流ifstream、ofstream、ftream文件输入输出流istringstream、ostringstream、stringstream字符串输入输出流三种流的关系:流的状态iostate:1.badbit:表示发生系统级的错误,如不可恢复的读写错误。......
  • C/C++花卉系统[2023-06-20]
    C/C++花卉系统[2023-06-20]数据结构与算法程序设计花苑1项目要求项目名称-花苑-项目类型-应用软件类项目难度-中等-素材资源-无(../res)使用工具-不限-编译系统-Windows、Linux硬件需求-无-程序语言-不限知识点-结构体/类、树、图、链表、查找、函数、文件操......
  • VS Code C++插件生成的临时文件的目录配置
    VSCodeC++插件生成的临时文件的目录配置默认情况下,每运行一次C++代码,就会生成一次临时文件。默认保存在C盘,可以修改VSCode的配置文件,更改临时文件的生成位置。修改临时文件的生成的目录所在位置。......
  • C++程序设计题[2023-06-20]
    C++程序设计题[2023-06-20]在设计时,同学们可以采用结构化程序设计方法、面向对象程序设计方法同时使用。目录前言I选题1学生成绩管理系统的设计与实现1一、设计要求1选题2运动会成绩管理系统的设计与实现3一、问题描述3二、设计要求3选题3图书管理系统的设计与实现5......
  • C++小案例之音乐播放器
    Common.h:点击查看代码#pragmaonce#include<iostream>#include<string>#include<vector>#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<list>#include<time.h>#include<map>#include<m......