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则不能编译,除非先转换为继承类再转换为兄弟基类

posted @ 2014-06-12 10:04  bobo的学习笔记  阅读(258)  评论(0编辑  收藏  举报