C++中按照不同作用的转换类型将其细分为四个显示类型转换符号static_cast, const_cast, reinterpret_cast,dynamic_cast。
相对于C语言强制转换的优点:
这种新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。能更清晰的表明它们要干什么。
1.static_cast(用于基本类型的强制转换)
- 能用于执行类型定义的显式转换,以及基础类型之间的标准转换。
double i=12.342;
int j=static_cast<int>(i);
- 允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。
class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = static_cast<Derived *>(a);
2.reinterpret_cast(用于不同类型之间的指针之间的转换)
- 转换一个指针为其它类型的指针,操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
- 这个操作符能够在非相关的类型之间转换(从一个指针转换为整数类型)。当情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。一个转换到足够大的整型能够使指针转换回有效的指针的。
3.const_cast(去除指针或者引用的const或volatile属性)
void Test ()
{
const int a = 2;
int* p = const_cast< int*>(&a );
*p = 3;
cout<<a <<endl;//3
}
4.dynamic_cast(用于多态类型之间的类型转换)
- dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换).
- 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
- 向下转型:父类对象指针/引用- >子类指针/引用(用dynamic_cast转型是安全的)
class Base { virtual fun() {} };
class Derived : public Base {};
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns 'NULL'
注意:
- dynamic_cast只能用于含有虚函数的类
- dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
- 与static_cast不同,它会检查转换是否会返回一个被请求的有效的完整对象。
- 检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.