参考这个:https://stackoverflow.com/questions/103512/why-use-static-castintx-instead-of-intx

隐式转换

1. 基本类型
  1. int a = true;
  • 如果从高精度转换为低精度,会出现警告

    2. 自定义类型
    1. class MyClass {
    2. public:
    3. MyClass(int a) {}
    4. MyClass(const char* p) {}
    5. };
    6. int main() {
    7. MyClass c1 = 10; // MyClass(10)
    8. MyClass c2 = "acc"; // MyClass("acc")
    9. }

    3. 使用explicit禁止隐式转换
  • explicit专门用于构造函数,可以抑制隐式转换

    1. class MyClass {
    2. public:
    3. explicit MyClass(int a) {}
    4. };
    5. int main() {
    6. MyClass c1 = 10; // error
    7. MyClass c2 = MyClass(10); // ok
    8. }

C风格的显式转换

  1. double dValue = 100.2;
  2. int nValue = (int)dValue;
  3. void* ptr;
  4. 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>

  • 将常量指针,对象,引用转化为非常量