条款1:尽量以const 和 inline 取代 #define #define ASPECT_RATIO 1.653 -> const double ASPECT_RATIO = 1.653; 原因是编译器会看不到ASPECT_RATIO这个符号名,它会先被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。 #define max(a,b) ((a) > (b) ? (a) : (b)) -> inline int max(int a, int b) { return a > b ? a : b; }或者全量版本的template template<class T> inline const T& max(const T& a, const T& b) { return a > b ? a : b; } 原因#define定义的宏行为不可预期,没有没有引数型别检查,而inline可以解决这两个问题,而且不会降低效率。 条款2:尽量用<iostream>而不用<stdio.h> 原因是iostream 有型别安全性,并且可扩充,易用,不用记那么多格式。 条款3:尽量用new和delete而不用malloc和free 原因是malloc和free对于构造函数和析构函数一无所知。而new和delete能够和构造函数和析构函数有很好的互动。 条款4:尽量使用c++风格的注释
原因是c风格的注释会存在嵌套问题,使注释过早结束。
条款5:对应的new和delete要采用相同的形式(显然)。
条款6:记得在析构函数里对指针成员调用delete(显然)。条款7:预先准备好内存不够的情况
最简单的方法是使用set_new_handler和重载operator new,具体参见原著。 条款8: 写operator new和operator delete时要遵循常规 自己重写operator new时,很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:要有正确的返回值;要有内存不够时要调用出错处理函数(见条款7);处理好0字节内存请求的情况。此外,还要避免不小心隐藏了标准形式的new(条款9) operator new实际上会不只一次地尝试着去分配内存,它要在每次失败后调用出错处理函数,还期望出错处理函数能想办法释放别处的内存。只有在指向出错处理函数的指针为空的情况下,operator new才抛出异常。 条款9: 避免隐藏标准形式的new 在类里面重写的operator new必须支持标准new调用方式。 条款10: 如果写了operator new就要同时写operator delete 基类如果遗漏了虚拟构函数,operator delete就有可能工作不正确
|
|
来自: My Room 2012 > 《C/C 》