条款1:C++为一个语言联邦
1):C
2):Object-Oriented C++
3):Template C++
4):STL
内置函数类型时, pass-by-vale 通常比 pass-by-reference 高效;
用户自定义的构造、析构函数、template函数中 pass-by-reference-const 更高效。
请记住:
1):C++高效编程守则取决于你使用C++的哪一个部分。
条款2:尽量以const,enum,inline替换 #define
宏定义 #define 只是单纯的进行替换,不重视作用域,同时可能导致预期之外的错误:
1) | #define pint int *; // 宏定义类型的别名 pint a , b ; // 预期产生两个整形指针变量,实际上产生一个整形指针变量 a , 一个整形变量 b 。 |
2) | #define CALL_MAX(a , b) f((a) > (b) ? (a) : (b)) // 宏定义带实参的函数 int a = 5, b = 0; CALL_MAX(a , b); // 正确返回 CALL_MAX(++a, ++b); // 错误返回,此类情况下,输出由输入参数决定 |
请记住:
1):单纯变量以const 对象 或者 enum 替换 #define
2):对于形似函数的宏,最好改用 inline 函数替换 #define
条款3:尽可能使用const
Const 用于修饰 global 或者 namespace 作用域的常量;
用于修饰文件、函数、区块作用域中声明为 static的 对象;
用于修饰 class 内的成员变量;
用于修饰指针、指针所指物等。
函数声明时,可以用 const 修饰: 函数返回值,参数、函数自身(类中的成员函数)。
成员函数的const版本和非const版本可以相互重载。
Static | 变量 | 全局静态变量、局部静态变量 |
| 静态函数 | 本源文件的作用域 |
Inline 函数默认为静态函数
请记住:
1):声明 const 类型的对象、参数、函数返回类型、成员函数,可以帮助编译器侦测错误用法;
2):可以利用 non-const 成员函数调用 const 版本的成员函数避免代码重复
条款4:确定对象被使用前已经被初始化
请记住:
1):为内置对象进行手工初始化,C++不保证初始化他们
2):构造函数最好使用成员处置列实现初始化,不要再构造函数本体内使用赋值操作;
(本质上时初始化为空的对象,再对空对象赋值,成本增加)
处置列列出的成员变量次序应当与 它们在 class 中的声明次序相同。
3):为免除 跨编译单元的初始化次序 问题,用 local static 对象替换 non-local static 对象