C++ 类型转换

来源:互联网 发布:电子相册软件排行 编辑:程序博客网 时间:2024/06/01 10:28

C++可以通俗的说是C的升级版,C风格的类型转换是不合适的(不安全的),任意类型之间可以转换。

比如在C中,可以把指向const对象的指针转换成指向非const对象的指针,或把指向基类对象的指针指向派生类对象的指针(此时通过转变后的指针调用派生类才用的方法时会发生严重错误,因为指针所指的内存空间没有改变,这种操作是对内存的操作,后果难以预料)。


C++为了克服这些缺点,引进了四种新的类型转换操作符。

C++具有四中强制类型转换,所以C++不是类型安全的。

static_cast、dynamic_cast、const_cast、reinterpret_cast

四种强制转换的区别:

static_cast:用于实现C++内置基本数据类型之间的相互转换

对于类而言,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数???


const_cast:不能在不同的种类间转换,只能将非const 和 const之间相互转换。


reinterpret_cast:即为重新解释,意思是数据的二进制形式的重新解释,但不改变其值。比如指向数组的首地址指针,可以将其转换成数组对象的指针,再将其指针转换成数组对象的成员变量地址等。


重点

dynamic_cast:用于运行时检查该转换是否类型安全,但只在多态类型时合法即针对有虚函数表的对象。

(1)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

(2)不能用于内置的基本数据类型的强制转换。违背第一条

(3)虚函数主要用于多态,所以其转换是运行时处理,并检查类型。其他三种都是编译时完成的。

(4)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败则返回NULL。

运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中。只有定义了虚函数的类才有虚函数表,也说明了该类有想让基类指针或引用指向派生类对象来达到多态的效果,此时转换才有意义。

(5)在类的转换时,将子类指针转换成父类指针时,dynamic_cast和static_cast的效果是一样的。在将父类指针转换成子类指针时,dynamic_cast具有类型检查的功能。其转换成功与否与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

当将指向子类对象的指针转换成父类指针后,在将该指针转换成子类对象的指针才会成功。