前言
本篇学习C++中的四个类型转换符号,static_cast,dynamic_cast,const_cast,reinterpret_cast。
C++使用以上这四种转换代替C风格的强制类型转换。
static_cast
static_cast 用于低风险的转换,例如:
- 自动类型转换,如int转double
- 向上转换,如派生类指针转基类指针
- 向下转换,如基类指针转派生类指针(但不安全)
- 定义了转换构造函数和转换函数的类与类型转换
- void指针与其它指针转换
使用方法是static_cast<Type> (expression) :
Base* pb;
Derived* pd;
pd = static_cast<Derived*>(pb);
而不同内置类型指针转换、整型转指针等高风险转换不能使用static_cast。
static_cast 在编译时进行检查,转换失败时报错。
dynamic_cast
dynamic_cast 用于继承类之间的转换:
dynamic_cast 由于向上转换是安全的,不会在运行期间检查。而向下转型不安全,因此将在运行期间检查安全性:
Base* pb;
Derived* pd;
pd = dynamic_cast<Derived*>(pb);
对于向上转换,dynamic_cast 和static_cast 是类似的,对于向下转换,dynamic_cast 更安全。
dynamic_cast 是运行效率较低的转换。
注意:向下转换要求基类必须有虚函数。
const_cast
const_cast 用于去除表达式的const/volatile:
const int a = 6;
int* pa = const_cast<int*>(&a);
*pa = 5;
std::cout << *pa << std::endl;
std::cout << a << std:: endl;
&a 的类型为const int* ,必须使用const_cast<int*> 显式转换为int* ,不能隐式转换。
reinterpret_cast
reinterpret_cast 用于高风险的转换,是static_cast 的补充,适用于不同内置类型的指针转换,整型转指针。这些转换在static_cast 中是非法的:
int a = 6;
double* pa = reinterpret_cast<double*>(&a);
*pa = 5;
std::cout << *pa;
reinterpret_cast 不能去除表达式的const
由于转换风险大,因此尽量减少使用reinterpret_cast 。
|