C++语法
C++语法
强制类型转换
static_cast
用于基本数据类型之间的转换,以及在类层次结构中基类和派生类之间的指针或引用的转换。它在编译时执行,不提供运行时类型检查。
如果对象所属的类重载了强制类型转换运算符 T(如 T 是 int、int* 或其他类型名),则 static_cast 也能用来进行对象到 T 类型的转换。
static_cast 不能用于在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,当然也不能用于不同类型的引用之间的转换。因为这些属于风险比较高的转换。
例:
1 | int a = 10; |
dynamic_cast
用于类层次结构中的指针和引用的转换,它在运行时检查类型的安全性。它要求转换的类型必须包含至少一个虚函数。
如果转换失败,dynamic_cast会返回nullptr。
例:
1 | class Base {}; |
dynamic_cast与reinterpret_cast的区别:
- 用 reinterpret_cast 可以将多态基类(包含虚函数的基类)的指针强制转换为派生类的指针,但是这种转换不检查安全性,即不检查转换后的指针是否确实指向一个派生类对象。
- dynamic_cast专门用于将多态基类的指针或引用强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回 nullptr 指针。
const_cast
仅用于去除变量的const属性。它主要用于操作指向常量对象的指针或引用的const属性。
例:
1 | const int a = 10; |
reinterpret_cast
用于低级的强制类型转换,如改变指针类型或将指针转换为足够长度的整型。它仅仅复制位模式,不改变值本身。
[!warning]
这种转换是不安全的,因为它不保证转换结果的有效性:
例如,执意把一个 int* 指针、函数指针或其他类型的指针转换成 string* 类型的指针也是可以的,至于以后用转换后的指针调用 string 类的成员函数引发错误,则需要程序员自行承担查找错误的烦琐工作
例:
1 | int* a = new int; |
主题
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.