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 网站参考


浙公网安备 33010602011771号