C++风格中的强制类型转化和C语言有一定区别,C++引入四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast四个关键字,可以更好的控制转换的过程,并且从风格上来说更加清楚直观的表达转换的类型,一目了然。
1. static_cast
用法: static_cast<类型说明符>(变量或表达式)
主要有一下几种用法
1)用于结构层次中基类和派生类之间指针或引用的转换
由下向上转换安全,由上向下转换没有动态类型检查,不安全。
2)用于基本数据类型之间的转换,这种用法最常用,但需要发开人员保证转换的安全性
3)把空指针转换成目标类型的空指针
4)任何表达式转换成void类型
例如:
int num_a = 10;
int num_b = 20;
double num_c = static_cast<double>(num_a)
/ static_cast<double>(num_b);
2. const_cast
用法: cosnt_cast<类型说明符>(变量或表达式)
const用于修饰变量,表示该变量的值不可修改。
const_cast的作用是去掉这种特性,但其只作用于常数对象的指针或引用。
虽然可以操作,但通过const_cast操作常量变量的指针是一种无奈之举,应该尽量避免这种操作。
例子
const int a = 10;
const int * p = &a;
int *q = const_cast<int *>(p); // 不可以写const_cast<int>(a)
*q = 20; // a的值不会变
3. reinterpret_cast
用法: reinterpret_cast<类型说明符>(变量或表达式)
主要用途:
1)改变指针或引用的类型
2)将指针或引用转化为一个足够长度的整型
3)将整型转化为指针或引用类型
该类型的转换仅为比特位的拷贝,所以常用于和指针有关的操作,使用时应谨慎。
例子
// socket本机地址结构体设置
struct sockaddr m_serverAddr;
struct sockaddr_in *serverAddr = reinterpret_cast<struct sockaddr_in *>(&m_serverAddr);
serverAddr->sin_family = AF_INET;
serverAddr->sin_port = htons(m_port);
serverAddr->sin_addr.s_addr = htonl(INADDR_ANY);
4.dynamic_cast
用法: reinterpret_cast<类型说明符>(变量或表达式)
注意:
1)其他三种时编译时完成的,dynamic时运行时处理的。运行时进行类型检查
2)不能用于内置的基本数据类型的强制转换
3)dynamic转换成功返回的是指向类的指针或引用,失败会返回NULL
4)使用dynamic转换时基类中一定有虚函数,否则编译不通过。
5)向上转换时dynamic和static转换效果一致,向下转换时具有类型检查的功能,因此更安全。
此处仅索引记录。
参考文章:C++ 四种强制类型转换