温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

effective c++学习笔记

发布时间:2020-10-16 05:32:08 来源:网络 阅读:670 作者:firekido 栏目:编程语言

--------------------1让自己习惯c++-----------------------------------------

Rule 1 : c++看做一个语言联邦,共有4个次语言:c(区块、语句、预处理器、内置数据类型、数组、指针);面向对象c++(类、封装、继承、多态、虚函数);模板c++STL(容器、迭代器、算法以及函数对象)。当你从某个次语言切换到另一个,导致高效编程守则要求你改变策略时,不要感到惊讶。

 

Rule 2:尽量以constenuminline替换#define,尽量以编译器代替预处理器。

 

Rule 3 尽可能使用constconst最具微力的应用是面对函数声明时的应用:函数返回值,各参数,成员函数自身。

 

Rule 4:确定对象被使用前已先被初始化。需要关注三方面的问题:1.对内置类型意外的任何其他东西,确保每一个构造函数都将对象每一个成员初始化。2.构造函数的初值列列出的成员变量,其排列次序应该和他们在class中的声明次序相同。3.定义于不同编译单元的non-local static对象的初始化次序是不确定的。解决方法:将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static

-------------------2构造/析构/赋值运算  ----------------------------------------

Rule 5:了解c++默默编写并调用了这些函数(都是publicinline):默认构造函数,默认析构函数,复制构造函数,复制赋值操作符函数。

 

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:成对使用newdelete时要采用相同的形式。

 

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-membernon-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 classesinterface classes

 

--------------------------6继承与面向对象设计---------------------------------

Rule 32:确定你的public继续塑模出is-a关系。

类之间的三种关系:is-ahas-ais-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 Dprivate形式继承class B,则用意是为了采用classB内已经备妥的某些特性。

 

Rule 40:明智而审慎地使用多重继承。

 

 

-----------------------7模板与泛型编程-------------------------------------------------------------------

Rule 41:了解隐式接口和编译期多态。

classestemplates都支持接口和多态。

classes而言,接口是显式的,以函数签名为中心,多态则通过virtual函数发生于运行期。

template参数而言,接口是隐式的,奠基于有效表达式(如if语句内的表达式),多态则是通过template具现化和函数重载解析发生于编译期。

 

Rule 42:了解typename的双重意义。

 

Rule 43:学习怎么获得基类模板中的名称。

 

Rule 44:将与参数无关的代码抽离templates

 

Rule 45:运用成员函数模板接受所有兼容类型。

 

Rule 46:需要类型转换时请为模板定义非成员函数。

 

Rule 47:请使用traitsclasses表现类型信息。

 

Rule 48:认识templates元编程。

------------------------8定制newdelete------------------------------------------------------------------------

Rule 49:了解new-handler的行为。

 

Rule 50:了解newdelete的合理替换时机。

 

Rule 51:编写newdelete时需固守常规。

 

Rule 52:写了placementnew也要写placement delete

 

------------------------------------9杂项讨论----------------------------------------------------------------------------

Rule 53:不要轻忽编译器的警告。

 

Rule 54:让自己熟悉包括tr1在内的标准程序库。

 

Rule 55:让自己熟悉boost

 

 

 


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI