7.1.为什么不适用C的强制类型转换?
C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。
7.2.static_cast
static_cast用的最多,对于各种隐式转换,非const转const,void*转指针等, static_cast能用于多态想上转化,如果向下转能成功但是不安全,结果未知。
1 #include "pch.h"
2 #include <iostream>
3 using namespace std;
4 int main()
5 {
6 //普通的double转为int型,编译器将不再提醒精度丢失
7 int value = 5;
8 int value_1 = static_cast<int>(value);
9 cout << value_1 << endl;
10 //将void*转换回初始的指针类型
11 void * p = &value;
12 //必须确保指针转换后所得的类型就是指针所指的类型,这里类型与原类型不符,所得结果未知,有些编译器可以编译通过,但结果未知
13 //警告:结果未知,*q不可能是5.0
14 double *q = static_cast<double *>(p);
15 cout << *q << endl;
16 //可以将非const转换为const
17 int p_1 = 5;
18 const int p_2 = static_cast<const int>(p_1);
19 cout << p_2 << endl;
20 //错误,不允许转换带有底层const的类型
21 const int * p_3 = &p_1;
22 // int * p_4 = static_cast<int *>(p_3);
23 //可以去掉顶层const属性
24 int * const p_5 = &p_1;
25 int * p_6 = static_cast<int *>(p_5);
26 //这是一个特别有意思的转换
27 //static_cast<string>(m)的含义是以m为参数构造一个string类型的返回值,这个转型的过程必需是在编译期可以确定的。
28 //在string类内部有这样一个构造函数string (const char* s)
29 const char *m; // 底层const
30 string t = static_cast<string>(m);
31
32 return 0;
33
34 }
7.3.const_cast
const_cast用于将const变量转为非const
1 //const_static 只能改变运算对象的底层const
2 const char* pc="qq";
3 //正确,但是通过q_1写值是未定义的行为
4 char *q_1 = const_cast<char *>(pc);
5 //错误,const_cast只能改变常量属性,不能改变类型
6 const_cast<string>(pc);
7.4.reinterpret_cast
reinterpret_cast几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;
7.5.dynamic_cast
dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。
原文:https://www.cnblogs.com/Royzzzzz/p/10990680.html