🍑03-C++面试之四种强制类型转换

0 前述

针对于自己在秋招的面试中,对于Cpp部分遇到的问题,其中大部分是以此为起点,尼克以基于这些点,将自己对于Cpp的学习,串联起来,无论面试官,问这一类问题中的那个点,你都应该可以将这一个珠子串联到自己一大串知识点上来讲。这是一种拓展知识的能力。

在此专栏下面个人校招记录:回馈牛客,对CPP做一个小小的总结。

本部分关于C++ 4种强制类型转换的总结,给出4中强制类型转换的内容和使用形式。

  • 下面对应的是之前发布的个人校招其他公司面试总结,希望可以更好的帮到你

1 C++中基本数据类型

C++ 的基本数据类型中,可以分为4类:整形、浮点型、字符型、布尔型。其中数值类型包括整型与浮点型,字符类型为char

  1. 将浮点型给整型,舍弃其小数部分
  2. 将整型给浮点型,数值不变,以指数形式存储
  3. double型给float型,注意数值范围溢出
  4. char型给整型,存入的对应的ASCLL码值
  5. int shortlong型数据给char型变量,只将低八位原封不动的送到char型变量中
  6. 有符号型数据给无符号型数据,连同原来的符号位一起传送(反之,一样,最高位作为符号位进行传送)

2 static_cast

static_cast用于数据类型的强制转换,强制将一种数据类型转换为另一种数据类型。比如下面的例子将int-->float

我的理解是和C中的类型转换一样。

C语言的形式:

int a =10;
int b =3;
double result =(double)a / (double)b;

C++中可以写成

int a =10;
int b =3;
double result =static_cast<double>(a) /static_cast<double>(b);

3 const_cast (不建议使用)

C语言中,const修饰的变量用来表示该变量只读的特性,表示不可被修改。

const_cast正是用于强制去掉这种不能被修改的常数特性,需要注意的是,const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或者引用的常量性,即是去除常量性的参数对象必须为指针或者引用

  1. 常量指针转化为非常量指针,并且仍然指向原来的对象
  2. 常量引用转化为非常量引用

const_cast 的使用

int main() {
    const int a =10;
    const int *p =&a; // 必须使用这样类型的指针,表示所指之物是常量形式(指针可以该,所指之物不能更改)// 表示一个常量指针
    int *q;
    q =const_cast<int *> (p);
    *q =20;
    
    cout << a << " " << *p << " " << *q << endl;
    cout << &a << " " << p << " " << q << endl;
    return 0;
}
 *  正在执行任务: e:\Codefield\Code_C\EverNote_typora\CPP测试\exercise\bin\test_cast.exe 

10 20 20
0x61fe0c 0x61fe0c 0x61fe0c

结果输出:通过指针的修改的值确实被改变了,修改了常量,但是对应的还是a =10的。一般的话,是不建议使用它,毕竟将变量声明为const类型常量就是不希望修改它,如果后面能修改,这就很恐怖

这种*q =20的行为是未定义行为语句,这种语句的具体行为由编译器来自行决定如何处理。我们应当避免使用这种未定义行为的语句!

4 reinterpret_cast

C++语言中,reinterpret_castreinterpret:重新解释)有三种强制转换用途:

1)改变指针或引用类型;

2)将指针或者引用转变为一个足够长的整形;

3)将整形转换为指针或者引用类型。

用法:可以把指针转化成一个整数,也可以把一个整数转换成一个指针。

在使用reinterpret_cast强制转换的过程仅仅是比特位的拷贝,在使用过程中需要十分谨慎!

int *a =new int;
double *d =reinterpret_cast<double*> (a);

5 dynamic_cast(可用于继承里面转换)

用于继承里面转换格式:dynamic_cast<derived*> (new base)

  1. 上面三种都是编译时完成的,dynamic_cast运行时处理的,运行时要进行类型检查。

  2. 不能用于内置的基本数据类型的强制转换。

  3. dynamic_cast的转换如果成功的话返回的是指向类的指针或者引用,转换失败的话直接返回NULL

  4. 使用条件,基类中一定要有虚函数,否则编译不通过;

    🤔需要有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针/引用,指向派生类的对象的情况,此时转换才有意义。运行时类型检查需要运行时类型信息,该信息存储在虚函数表中,只有定义了虚函数才会有虚函数表。

  5. 类的转换时候,进行上行转换时,dynamic_caststatic_cast的效果是一样的;下行转换时,dynamic_cast具有类型检查功能,比static_cast更安全。

6 网站参考

#C++##软件开发2023笔面经##晒一晒我的offer##我的实习日记#
个人校招记录【回馈牛客】 文章被收录于专栏

这是一个求职总结专栏,求职过程中,牛客里面各位同志,提供了很多面试的信息,对我个人有很大的帮助。这里简单将自己面试记录总结于此。 本人23届校招生,双非硕士,投递岗位嵌入式,控制算法,后台开发均有涉猎,优先级递减。简历累计投递数量:提前批(34)+正式批(128),累计Offer(5+)。

全部评论
兄弟,试试光伏电池行业~
点赞 回复 分享
发布于 2023-09-10 16:26 浙江

相关推荐

不愿透露姓名的神秘牛友
10-26 11:16
长鑫存储 数字电路 35.5x15 硕士985
点赞 评论 收藏
分享
很早就投了,不知道为什么流程这么慢。两名面试官,一男一女,我主要是做机器人的,他们也没办法问项目,全程八股拷打。要说唯一的优势,可能是我用过Auto&nbsp;CAD吧一面1.&nbsp;做了那么多嵌入式,为什么想来搞纯软开发?2.&nbsp;项目里面印象深刻的点?3.&nbsp;进程之间的通讯方式?4.&nbsp;讲一讲静态多态(重载)的实现原理?5.&nbsp;返回值可以作为重载的区分条件吗?const与非const形参能作为重载的区分条件吗?6.&nbsp;为什么要有智能指针?讲一讲share_ptr?7.&nbsp;引用计数有没有可能无法清零?怎么解决循环引用的问题?8.&nbsp;说一下动态多态的实现原理?虚表和虚指针存放在哪里?9.&nbsp;说一说内存分布模型?10.&nbsp;知道哪些排序算法?11.&nbsp;说一说快排的思路?什么情况下快排有复杂度最大的情况?12.&nbsp;说一下堆的概念?讲一讲堆排序?13.&nbsp;堆排序时间复杂度多少?有比堆排复杂度还低的吗?14.&nbsp;STL里面的sort函数用的哪种排序算法?15.&nbsp;unordered_map和map有什么区别?16.&nbsp;迭代器的原理?为什么有了指针还要迭代器?(我说有++这种可以顺序访问容器里面的元素,指针不行,但面试官好像不太满意)17.&nbsp;说一说vector和list的区别?18.&nbsp;c++开发和嵌入式更倾向哪个?反问------------------------------------------约11.11二面#软件开发笔面经##面经#
查看18道真题和解析 软件开发笔面经
点赞 评论 收藏
分享
4 12 评论
分享
牛客网
牛客企业服务