--------------------1让自己习惯c++-----------------------------------------
Rule 1 : 把c++看做一个语言联邦,共有4个次语言:c(区块、语句、预处理器、内置数据类型、数组、指针);面向对象c++(类、封装、继承、多态、虚函数);模板c++;STL(容器、迭代器、算法以及函数对象)。当你从某个次语言切换到另一个,导致高效编程守则要求你改变策略时,不要感到惊讶。
Rule 2:尽量以const、enum、inline替换#define,尽量以编译器代替预处理器。
Rule 3: 尽可能使用const。const最具微力的应用是面对函数声明时的应用:函数返回值,各参数,成员函数自身。
Rule 4:确定对象被使用前已先被初始化。需要关注三方面的问题:1.对内置类型意外的任何其他东西,确保每一个构造函数都将对象每一个成员初始化。2.构造函数的初值列列出的成员变量,其排列次序应该和他们在class中的声明次序相同。3.定义于不同编译单元的non-local static对象的初始化次序是不确定的。解决方法:将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static)
-------------------2构造/析构/赋值运算 ----------------------------------------
Rule 5:了解c++默默编写并调用了这些函数(都是public且inline):默认构造函数,默认析构函数,复制构造函数,复制赋值操作符函数。
Rule 6:若不想使用编译器自动生成的函数,就该明确拒绝。例如若不想类被复制或者赋值,就该明确拒绝,这有两个方法。
Rule 7:为多态基类声明virtual析构函数。
Rule 8:让异常逃离析构函数。析构函数绝对不要吐出异常,这会导致程序可能过早结束或出现不明确的行为。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。
Rule 9:绝不在构造和析构过程中调用虚函数,这类调用从不下降至派生类。解决办法是令派生类将必要的构造信息向上传递至base class构造函数。令函数为static,也就不可能意外指向“初期未成熟之对象内尚未初始化的成员变量”。
Rule 10:令operator = 返回一个referenceto *this。
Rule 11:在operator = 中处理“自我赋值”。
Rule 12:复制对象时勿忘其每一个成分。
---------------------3资源管理---------------------------------------------------------
Rule 13:以对象管理资源。令资源在构造期间获得,在析构期间释放。
Rule 14:在资源管理类中小心copying行为。当一个RAII对象被复制,会有以下2种处理方式:1.禁止复制,2.对底层资源祭出“引用计数法”:通常只要内含一个tr1:shared_ptr成员变量,RAIIclasses便可实现出引用计数的复制行为。
Rule 15:在资源管理类中提供对原始资源的访问。
Rule 16:成对使用new和delete时要采用相同的形式。
Rule 17:以独立语句将newed对象置入智能指针,否则可能导致资源泄露,应该将以下语句:
processWidget(std::tr1::shared_prt<Widget>(newWidget),priority());
替换为(独立语句)
std::tr1::shared_ptr<Widget>pw(new Widget);
processWidget(pw,priority());
----------------------------4设计与声明-------------------------------------------------------
Rule 18:让接口容易被正确使用,不易被误会。
Rule 19:设计class犹如设计type。应该和“语言设计者当初设计语言内置类型时”一样谨慎地来研讨class的设计。
Rule 20:尽量以pass-by-reference-to-const替换pass-by-value,但对内置类型,pass-by-value往往比较适当。
Rule 21:必须返回对象时,别妄想返回其reference。
Rule 22:将成员变量声明为private。
Rule 23:宁以non-member、non-friend替换member函数。
Rule 24:如果需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那个这个函数必须是个non-member。
Rule 25:考虑写出一个不抛出异常的swap函数。
----------------------------------------5实现------------------------------------------------------
Rule 26:尽可能延后变量定义式的出现时间,这样可以避免构造(和析构)非必要对象。
Rule 27:尽量少做转型动作。C++的集中转型类型:
const_cast<T>(expression) //唯一可将对象的常量性移除。
dynamic_cast<T>(expression) //安全向下转型
reinterpret_case<T>(expression) //执行低级转型
static_cast<T>(expression) //强迫隐式转换,例如non-const对象转为const对象,或将int转为double等等。
Rule 28:避免返回handles指向对象内部成分,这样会破坏封装性和const性。
应该将
Point& upperLeft() const {returnpData->ulhc;}
替换为
const Point& upperLeft() const {returnpData->ulhc;}
Rule 29:为“异常安全”而努力使值得的。
Rule 30:透彻了解inlining。一开始不要将任何函数声明为inline,或至少将inlining施行范围局限在那些“一定成为inline”或“十分平淡无奇”的函数身上。
Rule 31:将文件间的编译依存关系降至最低,将接口与实现分离。一般构想是相依于声明式,不要相依于定义式。基于此构想的2个手段是handle classes和interface classes。
--------------------------6继承与面向对象设计---------------------------------
Rule 32:确定你的public继续塑模出is-a关系。
类之间的三种关系:is-a,has-a,is-implemented-in-terms-of(根据某物实现出)
Rule 33:避免遮掩继承而来的名称。
如果你继承base class并加上重载函数,而你又希望重新定义或覆写其中一部分,那么你必须为那些原本会被遮掩的每个名称引入一个using声明式,否则某些你希望继承的名称会被遮掩。
当你不想继承base class的所有函数,可以使用private继承和转交函数(什么是转交函数?调用基类函数的函数)。
Rule 34:区分接口继承和实现继承。
Rule 35:考虑virtual函数以外的其他选择。
藉由non-vitualinterface手法实现template method模式:虚函数应该几乎总是private,令客户通过public non-virtual成员函数间接调用private virtual函数。
藉由函数指针实现策略模式。
Rule 36:绝不重新定义继承而来的non-virtual函数。
Rule 37:绝不重新定义继承而来的缺省(默认)的参数值。
Rule 38:通过复合塑模出has-a或“根据某物实现出”。
Rule 39:明智而审慎地使用private继承。如果class D以private形式继承class B,则用意是为了采用classB内已经备妥的某些特性。
Rule 40:明智而审慎地使用多重继承。
-----------------------7模板与泛型编程-------------------------------------------------------------------
Rule 41:了解隐式接口和编译期多态。
classes和templates都支持接口和多态。
对classes而言,接口是显式的,以函数签名为中心,多态则通过virtual函数发生于运行期。
对template参数而言,接口是隐式的,奠基于有效表达式(如if语句内的表达式),多态则是通过template具现化和函数重载解析发生于编译期。
Rule 42:了解typename的双重意义。
Rule 43:学习怎么获得基类模板中的名称。
Rule 44:将与参数无关的代码抽离templates。
Rule 45:运用成员函数模板接受所有兼容类型。
Rule 46:需要类型转换时请为模板定义非成员函数。
Rule 47:请使用traitsclasses表现类型信息。
Rule 48:认识templates元编程。
------------------------8定制new和delete------------------------------------------------------------------------
Rule 49:了解new-handler的行为。
Rule 50:了解new和delete的合理替换时机。
Rule 51:编写new和delete时需固守常规。
Rule 52:写了placementnew也要写placement delete。
------------------------------------9杂项讨论----------------------------------------------------------------------------
Rule 53:不要轻忽编译器的警告。
Rule 54:让自己熟悉包括tr1在内的标准程序库。
Rule 55:让自己熟悉boost。
本文出自 “FireKido的技术人生” 博客,请务必保留此出处http://zhangzhao.blog.51cto.com/12934593/1970517
原文地址:http://zhangzhao.blog.51cto.com/12934593/1970517