c++中的类型转换
c++中的转换方法: cast-name<type> (expression)
注意 转换的时候,就算指针的类型发生变化,编译器并没有改变内存的内容,原来的指针指向哪儿还是在哪儿,这在有时候会出现一些不可思议的结果
p175
其中 cast-name有四种:static-cast,const-cast,reinterpret-cast,dynamic-cast
1,reinterpret_cast和蒋园括号蒋类型括起来的效果相同
int *ip; char * pc=(int*)pc; 等价于 char * pc =reinterpret_cast<char*>(ip)
2,const_cast是唯一可以转换到表达式const性质的转换
const double value=0.0f; double* pd=const_cast<double*>(&value);
3,static_cast的效果类似于编译器隐式执行的所有类型转换。
对于基本类型,只有当相互之间可以隐式转换的时候,static_cast的转换才是合法的,否则蒋出错
对于类层次之间的转换,相对复杂些,参见下面dynamic_cast的介绍
4,dynamic_cast转换的对象只能是指针或者引用,涉及运行时的类型检查,需要检查虚函数表,因此只有对有虚函数表的类才能使用dynamic_cast
dynamic分为两步执行
1)检查请求的转换是否有效,否则返回NULL(对指针)或者返回异常(对引用)
2)只有转换有效,才进行检查
对于类间的上行转换和下行转换:
1)进行上行转换的时候,因为默认就可以进行隐式转换,因此static_cast和dynamic_cast是等效的
2)进行下行转换的时候,dynamic_cast比static_cast更安全。
对于单类继承,如果指针确实指向继承类的对象,那么向下转型时,dynamic_cast比static_cast都可以成功;但是如果指针指向的基类对象,dynamic_cast会报错,但是static_cast则试图用基类指针去操作继承类,是不安全的。
对于多继承,如果指针确实指向继承类的对象,那么向下转型时,dynamic_cast比static_cast都可以成功;但是如果指针指向的基类对象,dynamic_cast会报错,但是static_cast则试图用基类指针去操作继承类,是不安全的。但是蒋声明时的基类指针转换到其兄弟类的时候,dynamic_cast可以成功,然而static_cast则不能编译,除非先转换为继承类再转换为兄弟基类