条款1 C++是一个多重范型编程语言,我们应该将其视为一个语言联邦(同时支持面向过程、面向对象、函数形式、范型形式、源编程形式的语言)主要包括四大块:C语言、面向对象C++、模板C++、STL。
条款2 尽可能用const、enum、inline替换#define
- 对于单纯常量,最好用const对象或者enums替换#define
- 对于形似函数的宏,最好用inline函数替换#define
条款3 尽可能使用const
- 将某些东西声明为const可帮助编译器侦测出错误的用法。const可以被施加于任何作用域内的对象、函数参数、函数返回类型、函数本体。
- 在类的成员函数后面加const表示不允许该函数修改类的数据成员。
- 在函数参数中使用常量指针时表示在函数中不能改变指针所指向的内容
- 在函数(返回值)前加const,表示其返回值不可变
- 当存在同名同参数和返回值的常量函数和非常量函数时,常量对象调用常量成员;非常量对象调用非常量的成员。
- 当const和non-const成员函数有着实质性的等价实现时,令non-const版本调用const版本可以避免代码重复。
Class ClassA {
string text;
public:
ClassA(string s) : text(s){};
const char& operator[] (size_t position) const // const版本
{
... 做一些额外的事情
return text[position];
}
char& operator[] (size_t position) // 非const版本
{
... 做一些额外的事情
return text[position];
}
}
改写为:
Class ClassA {
string text;
public:
ClassA(string s) : text(s){};
const char& operator[] (size_t position) const
{
... 做一些额外的事情
return text[position];
}
char& operator[] (size_t position) // 非const版本通过const版本实现
{
// 首先static_cast将*this对象转型为const对象,然后调用const版本operator[]返回const引用
// 然后用const_cast去掉返回值的const属性
return const_cast<char&>(static_cast<const ClassA &>(*this)[position]);
}
}
non-const版本调用const版本来实现,减少了代码的冗余
条款4 确定对象被使用前已经先被初始化
- 在变量定义时就对其进行初始化。
- 使用构造函数的初始化列表可以对类的成员变量进行高效初始化,而在函数内进行的初始化操作实际上是进行赋值而非初始化,且列表排列次序要和声明次序一致。
- 为了避免跨单元调用static变量初始化次序出问题,使用local static对象替换non-local static对象。方法如下:
-
-
class FileSystem{...}; FileSystem& tfs() { static FileSystem fs; return fs; } //使用tfs() 代替tfs
-