c++有哪4个类型转换相关的关键字?各有什么特点,应该在什么场合下使用?
答: 相对于c风格的强制类型转换: (摘自:http://blog.sina.com.cn/s/blog_4b20940201013ryp.html)
(T) expression; // cast expression to be of type T
或 T(expression)
c++风格(新风格)的强制转换分为4中类型: 分别为
I. const_cast<>() : 一般用于消除对象的常量性。即:将一个const对象 转换为 非const 类型对象。 它是C++风格中进行此类转换的唯一方法。
class C{};
const C* a = new C;
C *b = const_cast<C*> (a); , 其他三种操作都不能修改一个对象的常量性。
II. static_cast<>(): 应用最广,最接近于c风格的类型转换,可以用于除const对象外的其他类型转换。转换对象包括指针、基础类型。但被转换的父类没有检查是否与目的类型一致。
class Base{};
class Derived: public Base{};
Base *a = new Base;
Derived* b = static_cast<Derived* > (a);
double d = 3.1415;
int i = static_cast<int> (d); // 基本类型的转换
III. dynamic_cast<>(): 只用于对象的指针和引用。把一个父类型向下转为子类型时(即隐式转换的相反过程),该操作会在运行时检查 返回的是否一个有效的完整对象,若不是,则返回NULL.
class Base{virtural dummy(){}};
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: return NULL
IV. reinterpret_cast<>() : 简单的将一个指针的值进行二进制拷贝到别的指针,不做任何类型的检查和转换。
class A{}
class B{}
A* a = new A;
B* b = reinterpret_cast<B* > (a);
新风格的好处:
(1) 在代码中更容易识别(无论是人还是grep等工具),这样就简化了在代码中找错的过程;
(2) 更精确地指定了每一个强制转换的目的,有效利用编译器进行错误判断。如,如果试图用const_cast以外的类型来消除常量,则编译报错。