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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值