参考这个:https://stackoverflow.com/questions/103512/why-use-static-castintx-instead-of-intx
隐式转换
1. 基本类型
int a = true;
-
2. 自定义类型
class MyClass {public:MyClass(int a) {}MyClass(const char* p) {}};int main() {MyClass c1 = 10; // MyClass(10)MyClass c2 = "acc"; // MyClass("acc")}
3. 使用
explicit禁止隐式转换 explicit专门用于构造函数,可以抑制隐式转换class MyClass {public:explicit MyClass(int a) {}};int main() {MyClass c1 = 10; // errorMyClass c2 = MyClass(10); // ok}
C风格的显式转换
double dValue = 100.2;int nValue = (int)dValue;void* ptr;MyClass* myClassPtr = (MyClass*)ptr;
C++风格的转换
dynamic_cast<T>
- 可以将子类型转换为父类型,父类型转换为子类型,不会进行类型检查
- 向上转换(upcast)是安全的;向下转换(downcast)不会进行运行时检查,不安全。
dynamic_cast<T>
- 将子类型转换为父类型时,同 static_cast
- 将父类型转换为子类型时,会进行类型检查。类型检查是通过虚表来实现的,所以要求父类必须要有虚函数
用于智能指针的类型转换:static_pointer_cast<T>dynamic_pointer_cast<T>
const_cast<T>
- 将常量指针,对象,引用转化为非常量
