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++中却没有对应的替代品。
如变长参数列表和预处理宏。