本文作为学习《Effective C++》的阅读笔记概览,希望通过学习写出高质量、高效率的代码
- 条款01:视C++为一个语言联邦
- 条款02:尽量以
const
,enum
,inline
替换#define
- 对于单纯常量,最好以
const
对象或enums
替换#define
- 对于形似函数的宏(macros),最好改用inline函数替换
#define
- 对于单纯常量,最好以
- 条款03:尽可能使用const
- 将某些东西声明为
const
可帮助编译器侦测出错误用法,const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。 - 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)
- 当
const
和non-const
成员函数有着实质等价的实现时,令non-const
版本调用const
版本可避免代码重复
- 将某些东西声明为
- 条款04:确定对象被使用前已先被初始化
- 为内置型对象进行手工初始化,因为C++不保证初始化他们
- 构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和他们在
class
中声明次序相同 - 为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。
- 条款05:了解C++默认编写并调用了哪些函数
- 编译器可以暗自为class创建
default
构造函数、copy
构造函数、copy assignment
操作符,以及析构函数。
- 编译器可以暗自为class创建
- 条款06:若不想使用编译器自动生成的函数。就该明确拒绝
- 为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明private并且不予实现。使用像
Uncopyable
这样的base class也是一种做法
- 为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明private并且不予实现。使用像
- 条款07:为多态基类声明
virtual
polymorphic
(带多态性质的)base classes
应该声明一个virtual
析构函数。如果class
带有任何virtual
函数,他就应该拥有一个virtual析构函数classes
的设计目的如果不是作为base classes
使用,或不是为了具备多态性(polymorphic
),就不该声明为virtual函数
- 条款09:别让异常逃离析构函数
- 析构函数函数绝对不要吐出异常,如果一个析构函数调用的函数可能抛出异常。析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序
- 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作