看了Effective C++ 感觉受益颇多,做些笔记,以便日后查看翻阅
一 让自己习惯C++
条款01:视C++为一个语言联邦
C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。
条款02:尽量以const,enum,inline替换#define
1. 对于单纯常量,最好以const对象或enums替换#defines.关于enum hack的用法和意义,这里有篇博文讲的比较好。
2. 对于形似函数的宏(macros),最好改用inline函数替换#defines.
条款03:尽可能使用const
1. 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体。
2. 编译器强制实施bitwiseconstness,但你编写程序时应该使用”概念上的常量性”(conceptual constness).(bitwiseconst阵营的人相信,成员函数只有在不更改对象之任何成员变量(static除外)时才可以说是const。也就是说它不更改对象内的任何一个bit。)若要在const成员函数内更改某成员变量,解决办法是将这些变量声明为mutable的。
3. 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复(先通过static_cast将non-const对象转为const对象调用const成员函数,再通过const_cast移除返回对象的const)。
条款04:确定对象被使用前已先被初始化
1 为内置型对象进行手工初始化,因为C++不保证初始化它们。
2 构造函数最好使用成员初值列(memberinitialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同(C++有着十分固定的”成员初始化次序”。base classes更早于其derived classes被初始化,而class的成员变量总是以其声明次序被初始化)。
3 为免除”跨编译单元之初始化次序”问题,请以localstatic对象替换non-local static对象(函数内的static对象称为local static对象,其它static对象称为non-local static对象;C++对”定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义,而C++保证,函数内的local static对象会在”该函数被调用期间””首次遇上该对象之定义式”时被初始化)。