在C++中延用C风格的类型转换,即(type)(expression) ,依然合法,但是C++风格的类型在准确性上的可读性要更高
1. static_cast<type> expression
和一般C风格转换无异,但不能从表达式中去掉const属性
2.const_cast<type> expression
用于去掉表达式中的const属性(包括volatileness属性)
例:
const int a =5;
//int & b = a; //错误
int & b = const_cast<int&> (a); //正确
3. dynamic_cast<type>(expression)
被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)
PS:基类必须含用虚函数/纯虚函数
例
class Base {
virtual void f(){};
};
class Derived : public Base{
};
int main() {
Base* pBase = new Derived;
Derived* pDerived = dynamic_cast<Derived *> (pBase);//去掉基类的virtual 会有编绎错误
}
4.reinterpret_cast<type>(expression)
最普通的用途就是在函数指针类型之间进行转换, 转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示)
--参见《More Effective C++》