《C++高级编程》之理解C++疑难问题(2)

2、类型强制转换
   C中使用()进行强制类型转换,这种老式的转换方法在C++仍然可用的。但是C++提供了四种新的类型转换方法:static_cast,dynamic_cast,const_cast和reinterpret_cast.因为C++的类型强制转换会完成更多的类型检查,这样可以得到更好的代码。
①、const_cast
    const_cast是最直接的类型强制转换。使用const_cast可以去除变量的常量性。
     例:const_cast<char*>(str) //template

②、static_cast
◇   可以使用static_cast来显示地完成C++语言直接支持的转换。
   例:double result = static_cast<double>(i);
◇   static_cast的另一个用法是在继承层次结构中完成向下类型强制转换。
例:Base* b; Derived* d = new Derived(); à d = static_cast<Derived*>b;
    Base b; Derived d; Base& br = b; Derived& dr = static_cast<Derived&>b;
这些类型强制转换可以应用于指针和引用,但是不能处理对象本身。
注:使用static_cast类型强制转换,不会完成运行时类型检查。要想安全地完成类型强制转换,同时进行运行时类型检查,请使用dynamic_cast。
根据C++类型规定,任何一种没有意义的转换static_cast都做不到。

③、reinterpret_cast
   reinterpret_cast功能比static_cast更强,随之而来的是安全性较低。
   例:calss X; calss Y; X* xp; Y* yp; à xp = reinterpret_cast<X*>(yp);
   在使用reinterpret_cast时要格外小心,因为它会把原来的位重新解释为不同的类型,而不完成任何类型检查。

④、dynamic_cast
   可以使用dynamic_cast来对指针或引用进行类型强制转换,dynamic_cast会在运行时检查底层对象的运行时类型信息。如果类型强制转换没有意义,dynamic_cast会返回NULL(对于指针转换)或者bad_cast异常(对于引用转换)。
    注意:运行时类型信息是存储在对象的vtable里面的,因此,要使用dynamic_cast,类必须至少有一个虚函数。
    需要注意的是,可以使用static_cast或reinterpret_cast沿着继承层次结构完成同样的向下类型强制转换。他们与dynamci_cast的区别是,dynamic_cast要完成运行时(动态)类型检查。

3、解析作用域
如果不想让一个变量使用默认的作用域解析,可以使用作用域解析操作符::。
4、头文件
超前引用:类头文件中声明class preference;而非#include包含。
5、C实用工具
   C++是C的超集,但是C的几个隐含特性在C++中却没有对应的替代品。
   如变长参数列表和预处理宏。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpszf.html