🍑03-C++面试之四种强制类型转换
0 前述
针对于自己在秋招的面试中,对于Cpp
部分遇到的问题,其中大部分是以此为起点,尼克以基于这些点,将自己对于Cpp
的学习,串联起来,无论面试官,问这一类问题中的那个点,你都应该可以将这一个珠子串联到自己一大串知识点上来讲。这是一种拓展知识的能力。
在此专栏下面个人校招记录:回馈牛客,对CPP
做一个小小的总结。
本部分关于C++ 4
种强制类型转换的总结,给出4
中强制类型转换的内容和使用形式。
- 下面对应的是之前发布的个人校招其他公司面试总结,希望可以更好的帮到你
-
这里是
Cpp
一些面试问题整理
1 C++
中基本数据类型
C++
的基本数据类型中,可以分为4类:整形、浮点型、字符型、布尔型。其中数值类型包括整型与浮点型,字符类型为char
型
- 将浮点型给整型,舍弃其小数部分
- 将整型给浮点型,数值不变,以指数形式存储
double
型给float
型,注意数值范围溢出char
型给整型,存入的对应的ASCLL
码值int short
和long
型数据给char
型变量,只将低八位原封不动的送到char
型变量中- 有符号型数据给无符号型数据,连同原来的符号位一起传送(反之,一样,最高位作为符号位进行传送)
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
不是用于去除变量的常量性,而是去除指向常数对象的指针或者引用的常量性,即是去除常量性的参数对象必须为指针或者引用
- 常量指针转化为非常量指针,并且仍然指向原来的对象
- 常量引用转化为非常量引用
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_cast
(reinterpret:重新解释
)有三种强制转换用途:
1)改变指针或引用类型;
2)将指针或者引用转变为一个足够长的整形;
3)将整形转换为指针或者引用类型。
用法:可以把指针转化成一个整数,也可以把一个整数转换成一个指针。
在使用reinterpret_cast
强制转换的过程仅仅是比特位的拷贝,在使用过程中需要十分谨慎!
int *a =new int;
double *d =reinterpret_cast<double*> (a);
5 dynamic_cast
(可用于继承里面转换)
用于继承里面转换格式:dynamic_cast<derived*> (new base)
-
上面三种都是编译时完成的,
dynamic_cast
是运行时处理的,运行时要进行类型检查。 -
不能用于内置的基本数据类型的强制转换。
-
dynamic_cast
的转换如果成功的话返回的是指向类的指针或者引用,转换失败的话直接返回NULL
-
使用条件,基类中一定要有虚函数,否则编译不通过;
🤔需要有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针/引用,指向派生类的对象的情况,此时转换才有意义。运行时类型检查需要运行时类型信息,该信息存储在虚函数表中,只有定义了虚函数才会有虚函数表。
-
类的转换时候,进行上行转换时,
dynamic_cast
和static_cast
的效果是一样的;下行转换时,dynamic_cast
具有类型检查功能,比static_cast
更安全。
6 网站参考
#C++##软件开发2023笔面经##晒一晒我的offer##我的实习日记#这是一个求职总结专栏,求职过程中,牛客里面各位同志,提供了很多面试的信息,对我个人有很大的帮助。这里简单将自己面试记录总结于此。 本人23届校招生,双非硕士,投递岗位嵌入式,控制算法,后台开发均有涉猎,优先级递减。简历累计投递数量:提前批(34)+正式批(128),累计Offer(5+)。