1. 强制类型转换(显示类型转换) C语言风格
int k = 5 % 3.2 // 语法错误
int k = 5 % (int)3.2; // 强制类型转换,C语言风格
int k = 5 % int(3.2); // 强制类型转换,C语言风格
2. 隐式类型转换
系统自动转换。
int sum = 3 + 12.333; // 15, 发生隐式类型转换
3. C++四种类型转换
3.1 static_cast
静态转换。类似于C风格的强制类型转换,编译时进行类型转换检查,需要自己保证正确。
3.1.1 适用情况:
(a)相关类型;如整型和浮点型。
double f = 100.34f;
int i = (int)f; // C语言风格
int i2 = static_cast<int>(f); // C++风格
(b)void*与其他类型指针转换。
void*转为其他类型时要注意,因为各类型的寻址范围、成员布局可能不同,在这种情况下互转可能出错。
int i = 10;
int* b = &i;
void* p = static_cast<void*>(b); // int*转为void*
int* p2 = static_cast<int*>(p); // void*转为int*
(c)派生类指针或引用转为基类指针或引用。
class Base { // 基类
};
class Derive : public Base { // 派生类
};
shared_ptr<Derive> d2 = make_shared<Derive>();
Base* b2 = static_cast<Base*>(d2.get()); // 派生类指针转为基类指针
Derive d3;
Base& b3 = static_cast<Base&>(d3); // 派生类引用转为基类引用
3.1.2 不适用情况
(a)一般不能用于指针类型之间的转换;
shared_ptr<int> a = make_shared<int>(10);
double* b = static_cast<double*>(a.get()); // 错误!
shared_ptr<double> a1 = make_shared<double>(10);
int* b1 = static_cast<int*>(a1.get()); // 错误!
3.2 dynamic_cast
运行时类型转换检查。
3.2.1 适用情况
(a) 基类指针或引用转为派生类指针或引用,不能转对象。
待补充。
3.3 const_cast
去除指针或引用的const属性。
const int i = 10;
int i2 = const_cast<int>(i); // 错误
const int* p = &i;
int* pi = const_cast<int*>(p); // 正确
*pi = 20; // 未定义行为(打印结果和调试结果不一致,很诡异),禁止如此操作
const int& refi = i;
int& ri = const_cast<int&>(refi); // 正确
3.4 reinterpret_cast
编译时进行类型转换检查。
可以进行无关类型的转换,随意转换。
比较危险,尽量避免使用。
3.4.1 适用情况
指针类型与数值型互转。