13 September 2014

参考《effective C++》《effective STL》 《C++ primer》

合理是使用继承和组合: 若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。 若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。

定义一个类时需要考虑的: 任何时候,你都要考虑如果发生异常将会怎么样?这对于你写出高质量的代码尤其有用。 public是is-a的关系。 1、函数构造 默认or自定义,是否有默认参数,参数个数、explict是否需要。 派生类要调用基类的构造函数。
构造函数和析构函数不要声明为inline.

2、是否需要拷贝构造函数,copy函数和 copy assigment函数 如果不需要:禁止操作。申明为private 或 定义一个uncopyable class 如果需要: 派生类在定义时也要调用基类的构造函数。 3、如果类是基类,虚函数,则要定义虚析构函数。 纯虚函数,则要声明纯虚析构函数 非虚函数 则不需要定义虚析构函数如STL 4、析构函数不要抛出异常,如果析构函数调用的函数要抛出异常,必须捕获、吞下或终止程序。 5、构造和析构函数中不要调用虚函数。 6、绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定, 而virtual 函数——你唯一应该覆写的东西——却是动态绑定。

7、成员函数:需要定义那些操作符 不要客户端直接用成员函数,而是用函数来调用成员函数。 提取公共代码,作为private,让需要的函数来调用。 是否是virtual或 non-virtual 是否使用模板 函数参数如果是内置类型或iterator或function object用by-value 如果非内置类型 by-reference 返回值:尽量不要使用引用。 尽量延迟定义变量(尤其是usr-define class变量)变量尽量用拷贝构造代替默认构造+拷贝赋值 仔细考量是否需要内联。 注意重载不慎导致隐藏、覆盖、。