条款1: 仔细区别Pointers和References
均用于间接指向其他对象,pointer存储对象所在的地址(4个字节),reference实质上是对象的别名:
1 显式区别:pointer定义时使用符号 ‘*’ ,reference定义时使用符号 ‘&’ (&用于指针表示取某个变量的地址,将其赋值给指针变量);Pointer访问指向的对象时使用 ‘->',reference 使用符号 ‘.’;
2 NULL: pointer可以为NULL(C++11 为nullptr);reference不能为NULL值,因此reference必须有初值;
3 效率:reference比pointer更富效率,因为在使用之前不需要测试其有效性(pointer使用前通常需要测试其是否为null);
4 可重写: pointer可以被重新赋值,reference只能表示它初始化时的对象;
5 实现某些操作符时(例如operator[]),一般使用reference作为返回值;
结论:当需要指向某个变量且绝对不会指向其他变量时,或者当一个操作符其语法需求无法用pointer完成时,选用reference,其他时候选用pointer;
条款2: 最好使用C++转型操作符
C旧式转型(语法格式:(type)expression )的缺点:
1 转型不能明确地指明意图(几乎允许任何类型之间的相互转换);
2 难以辨识(小括号和对象名称在C++任何地方都有可能被使用);
四个新的转型操作符:
static_cast(static_cast<type> expression): 基本上和旧式转型相同,有同样的意义和限制;
(与旧式转换的区别,旧式转换还可以模拟const_cast,reinterpret_cast,但是static_cast不行)
const_cast: 用于改变表达式的常量性或变易性
dymanic_cast: 用于执行继承体系中“安全的向下转型或跨系转型动作”,并得知转型是否成功,若失败,会以一个null指针(当转型对 象为指针)或exception(当转型对象为reference)表现出来;
只能用于集成体系中,无法应用在缺乏虚函数的类型上,也不能改变类型的常量性;
不涉及继承机制的类型执行转换动作,可使用static_cast;
(第二个用途:找出被某对象占用内存的起始点)
reinterpret_cast: 与编译平台息息相关,因此不具移植性
最常用用途是转换“函数指针”类型
使用新式转型的优点: 1 严谨,易辨识; 2 较容易解析,编译器也因此得以诊断
条款3:最好不要使用多态(polymorphically)方式处理数组
多态和指针算术不能混用,数组对象几乎总会涉及到所有的指针算术运算,所以数组和多态不能混用!
继承最重要的特性就是通过指向“base class objects”的pointers或references,来操作“derived class objects”,当进行指针算术运算或删除对象数组操作时,指针的偏移大小是根据base class大小进行操作,会造成意想不到的结果。
条款4:非必要不提供default constructor
?????(书没看懂)