【More Effective C++】基础议题
条款一:区别pointers和references
指针:可以更改指向的对象,不需要初始化,需要检测合法性(是否是NULL)
引用:不能更改指向对象,需要一个对象来初始化,实现某些操作符, 如
operator []
条款二:C++转型符
C++相比C增加了四类转型操作符
static_cast //隐式转换显式化 const_cast //脱去const类型 dynamic_cast //继承体系的向下安全转型,转型失败则返回NULL或者抛出exception reinterpret_cast //强制类型转换,结果与编译平台相关,因此不具有移植性
条款三:不要以多态的方式处理数组
数组对象往往会牵扯到指针的运算,指针运算则会设计对象的大小,因此会发生不可预计的错误
1 void printClass(ostream& s, const BaseClass array[], int num){ //定义函数 2 for(int i=0; i){ 3 s<<array[i]; 4 } 5 }
执行语句:
1 printClass(cout, derivedClass, 10);
子类和父类对象大小可能不一致,导致出现不可预见的错误。
条款四:非必要不提供default construtor
不提供default construtor会产生的三类问题:
1、对象数组的产生受限
2、不适用于template-based container classes,因为template-based container classes一般内部都有一个指针来表示数组。
3、对于虚基类,需要提供一个默认构造函数才能使得继承虚基类的子类能够轻松实例化