🍑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 浙江

相关推荐

2025-12-12 19:01
南京航空航天大学 C++
秋招没咋投,准备&nbsp;wxg&nbsp;转正之后摆烂了。结果不堪字节&nbsp;HR&nbsp;的骚扰还是面了一下字节。之前想去字节的时候怎么面都挂。现在想着随便面一下结果三面技术面都意外顺利还有加面。十月中旬字节发了意向,wxg&nbsp;转正结果无响应。十月底字节拉了保温群,wxg&nbsp;口头通过,系统显示考核中。十一月初和字节&nbsp;ld&nbsp;交流之后得知&nbsp;base&nbsp;居然能选海外,甚至能小&nbsp;wlb&nbsp;一下,wxg&nbsp;无响应无人联系。十一月中旬把字节&nbsp;base&nbsp;转到了海外,wxg&nbsp;流程灰了,一问超时忘处理了,过两天又变考核中了。十一月下旬字节换了海外&nbsp;HR&nbsp;对接,问了期望薪资,wxg&nbsp;考核终于显示通过,无&nbsp;HR&nbsp;保温,无其他保温。十一月底给字节报了个天价,想吓吓他们,同时告诉微信字节要开了,微信无响应。同样十一月底字节&nbsp;HR&nbsp;告诉我确实给不到那么高,但是能拿期权补上,问能不能接受。微信无响应。同样十一月底字节&nbsp;HR&nbsp;告知了具体方案,符合预期。&nbsp;微信无响应。十二月上旬催&nbsp;wxg&nbsp;不开我就盲拒了,wxg&nbsp;HR&nbsp;火急火燎的打电话问情况,问期望。我给了一个不算夸张的总包数字,因为今年市场在涨,过了三天还不联系我,我再催,约时间下午打电话,非得在我给出的数字上压下去几万,微信又不差这点,为什么不能满足我,让我没有拒绝的理由呢?一番纠结抗争,求稳还是追求挑战,最终选择接受迎接新的挑战,因为堂吉诃德永远不会停下脚步!回想起来,在&nbsp;wxg&nbsp;谈薪的阶段,我认为并没有给予我一定的重视,即使&nbsp;HR&nbsp;表示我在实习期间的表现和之前的面评都很靠前。也没有感觉到想要争取我,虽然我表示拒了&nbsp;offer&nbsp;之后要给我加面委定&nbsp;t6&nbsp;再涨,但我三个月没面试让我面面委那就是白给,还是算了。有缘再见了我亲爱的&nbsp;wxg,再见了曾经的梦中情厂,再见亲爱的&nbsp;mt,再见亲爱的朋友们。也再见,北京的一切。我想润了。秋招结束,卸载牛客,下一个三年,下一个五年,下一个十年后再来看看。
面试中的大熊猫爱吃薯...:我嫉妒得狗眼通红
点赞 评论 收藏
分享
评论
4
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务