More Effective C++ 条款2 最好使用C++转型操作符

1. C转型操作几乎允许将任何类型转为任意其他类型,由此造成极大地不安全性。

2. C转型操作对所有种类的转型使用一种语法,降低了代码的可读性。而C++的转型操作符则适用于更集中(狭窄)的目的。

3. C++的转型操作符:

    static_cast:几乎与C旧式转型相同的威力与意义以及相同的限制

    const_cast:用于去除某个对象的常量性

        用法:A* a=const_cast<A*>(&a1)       //a1是与A类型的对象

        注意:

        1)可以使用一个const对象经过const_cast后调用非const成员函数(否则需要对成员函数进行const重载);

        2)一个const对象经过const_cast可以“改变”其值,但是实际上经过了编译器的某些处理,使得通过指针a获取的值是改变后的,但是通过a1获取的是仍然是未改变的                   (为了不违背a1的const属性)

    dynamic_cast:用于进行downcast操作从而支持RTTI(运行时类型检查)

        注意:

        1)对于指针类型的downcast如果失败就返回空指针,对于引用类型的downcast如果失败就抛出bad_cast异常

        2)要使用dynamic_cast,必须被转换的类类型必须要有至少一个虚函数,否则会在编译时报错,底层原因是由于大多数编译器对于dynamic_cast的实现是通过虚函数指针           所指向的虚函数表的第一个节点所存储的指针所指向的type_info类型的对象的比对实现的,因而若没有虚函数,也就没有虚函数指针,dynamic_cast也就无从谈起。

    reinterpret_cast:”为操作数的为模式提供较低层次的重新编译"

        注意:

        1)所谓的”为操作数的为模式提供较低层次的重新编译"指的是操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,例如对于float变量         1.0,如果通过static_cast转换为int型变量则转换后的结果是1,但是如果通过reinterpret_cast则在dev-c++(windows7 32位系统)下结果是1067030938。

       

原文地址:https://www.cnblogs.com/reasno/p/4601162.html