文章目录
- static_cast
- POD类型互转
- 任意指针类型与void*互转
- 基类继承类之间的互转
- 具有目标类型转换函数的类/单参数的构造函数
- dynamic_cast
- reinterpret_cast
static_cast
所谓static,意思是在编译期进行的转换,static_允许如下转换:
POD类型互转
int, float, bool等POD类型互转
bool a = true;
int b = static_cast<int>(a);
任意指针类型与void*互转
bool a = 123;
// int* b = static_cast<int*>(&a); // 编译出错,static_cast不允许不相关类型指针的互转
void* p = &a;
int* b = static_cast<int*>(p); // 通过先转为void *再转int*是可以通过编译的
基类继承类之间的互转
class Base {};
class Derived : public Base {};Base b;
Derived* d = static_cast<Derived*>(&b);
具有目标类型转换函数的类/单参数的构造函数
class integer {int x;public:// constructorinteger(int x_in = 0): x{ x_in }{cout << "Constructor Called" << endl;}// user defined conversion operator to string typeoperator string(){cout << "Conversion Operator Called" << endl;return to_string(x);}
};
integer obj;
string str2 = static_cast<string>(obj); // integer类到string,通过类型转换函数
integer obj = static_cast<integer>(30); // int到integer类,通过构造函数
dynamic_cast
dynamic与static相对,在运行时根据内存中的实际对象类型进行类型转换,用于具有虚函数的基类和子类之间的转换,通常在基类指针向下转换到派生类指针时使用。
class Base
{virtual void f() {}};
class Derived : public Base
{
};Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
reinterpret_cast
任意类型之间的转换,主要在底层代码中使用
bool b = true;
int* a = reinterpret_cast<int*>(b);