显示类型转换
被称为强制类型转换(cast)
C风格:(type_id)
C++风格:static_cast, dynamic_cast, reinterpret_cast, const_cast
在《C++的设计和演化》中告诉我们,解决强制性类型转换的最好的解决方法是使用标准的C++的类型转换,也就是上面提到的四个类型转化。下面我们来看看这几个的区别。
static_cast:用法:static_cast<type_id>(expression)
该运算符把expression转换为type_id类型,但没有运行时的检查来保证转换的安全性。
使用static_cast的情况:1.void指针转其它类型的指针,2.改变通常的的标准转换,3.避免出现可能多种转化的歧义
具体使用情况如下:a.用于类中基类和子类之间指针或引用的转换,进行上行转行,就是把子类的指针或引用转换成基类表示是安全的,相反这是不安全的,原因是没有类型安全检查。
dynamic:dynamic_cast<type_id>(expression)
该运算符把expression转换成type-id,且这两部分必须是类的指针,类的引用或者void*。
dynamic_cast主要用于类层次间的上行转换下行转换,还可以用于类之前的交叉转换。在上行转换的时候它和 static_cast效果是一样的,在下行转换时,dynamic_cst更安全,应为它具有类型安全功能检查。dynamic_cast还可以使用如下的交叉的类型转换。
class A
{
publc:
int num;
virtul void f(){}
};
class B:public A
{
};
class C: public A
{
};
void f()
{
B* pb1 = new B;
pb1->num = 4;
C* pc1 = static_cast<C*>(pb1);
C* pc1 = dynamic_cast<C*>(pb1);
delete pd1;
}
在上述的函数f中static_cast进行转换是错误的,编译的时候编译器会终止编译,但是dynamic_cast是允许的,结果是空指针。
reinpreter_cast
const_cast:用法:const_cast<type_id>(expression)
该运算符用来修改类型的const或volatile属性,除了const和volatile修饰之外type_id和expression的类型是一样的。下面来一个简单列子:
class B{
public:
int iNum;
};
void f()
{
const B b1;
b1.iNum = 100;
B b2 = const_cast(b1);
b2.iNum = 200;
}
上面的b1那里修改值是会报错的,但是b2那里是不会报错的,用为用了cosnt_cast。