首页 > 代码库 > Effective C++学习笔记一

Effective C++学习笔记一

条款01视C++为一个语言联邦

? C

? Object-Oriented C++

? Template C++//泛型编程部分(generic programming

? STL

C++高效编程守则视情况而变化,取决与你使用C++哪一部分。

 

条款02尽量以const, enum, inline替换#define

? 对于单纯常量,最好以const对象或者enums替换#defines

? 对于形似函数的宏,最好改用inline函数替换#defines

 

条款03尽可能使用const

? 声明为const可帮助编译器侦测出错误用法。

? 编译器强制实施bitwise constness,但你编写程序时应该使用概念上的常量性

? 当constnon-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

 

条款04确定对象被使用前已先被初始化

? C++成员初始化次序是固定的,class的成员变量总是以其声明次序被初始化。但是它们可以在成员初值列中以不同的次序出现,没有影响。

? 构造函数中注意分清初始化操作和赋值操作。初始化是在成员初始化列表里面,而赋值是在构造函数本体里面进行的。

? 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。

? 为内置内型对象进行手工初始化,因为C++不保证初始化它们。

? 为免除跨编译单元之初始化次序问题,以local static对象替换non-local static对象。

 

条款05了解C++默默编写并调用哪些函数

? 编译器为class暗自创建了default构造函数、copy构造函数、copy assignment操作符、以及析构函数。

 

条款06:若不想使用编译器自动生成的函数,就该明确拒绝

? 为拒绝使用编译器自动生成的函数,可以将相应的成员函数声明为private并且不予实现。或者使用想Uncopyable这样的base class也可以。在该类中把你想要拒绝的函数设置为private类型。

 

条款07为多态基类声明virtual析构函数

? 带多态性质的base classes应该声明一个virtual析构函数 。如果class带有任何virtual函数,它就该拥有一个virtual 析构函数。

? Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不该声明为virtual析构函数。

 

条款08:别让异常逃离析构函数

? 析构函数绝对不要吐出异常,否则总会带来”过早结束程序”或”发生不明确行为”的风险。当然还会造成内存泄露。(比如删除vector<>

? 如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们不传播或结束程序。

? 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

 

条款09:绝不在构造和析构过程中调用virtual函数

? 由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化。如果此期间调用的virtual函数下降到derived classes阶层,而derived class的函数必然取用local成员变量,而那些成员变量此时尚未初始化,将会导致不明确行为。

? 在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class

 

 

条款10:令operator=返回一个reference to *this

? 令赋值(assignment)操作符返回一个reference to *this


Effective C++学习笔记一