一、让自己习惯C++
Item1. 视C++为一个语言联邦
C++由以下部分组成:C、Object-Oriented C++、Template C++、STL
Item2. 尽量以const、enum、inline代替#define
Item3. 尽可能使用const
1.一共有这样几种const用法:
char greeting[] = "Hello"; char *p = greeting; // non-const pointer, // non-const data const char *p = greeting; // non-const pointer, // const data char * const p = greeting; // const pointer, // non-const data const char * const p = greeting; // const pointer, // const data
另外,以下两种形式是一样的:
void f1(const Widget *pw); // f1 takes a pointer to a
// constant Widget object
void f2(Widget const *pw); // so does f2
迭代器也有const:
const std::vector<int>::iterator iter = // iter acts like a T* const
std::vector<int>::const_iterator cIter = //cIter acts like a const T*
2. 让non-const函数调用const函数以避免重复:
const char& operator[](std::size_t position) const // same as before { ... ... ... return text[position]; } char& operator[](std::size_t position) // now just calls const op[] { return const_cast<char&>( // cast away const on // op[]'s return type; static_cast<const TextBlock&>(*this) // add const to *this's type; [position] // call const version of op[] ); }
const函数可以使得返回的const指针、const引用等等均可以调用一些方法(const对象只能调用const函数)
Item4. 确保对象在使用前已经先被初始化
重要的是不能混淆赋值(assignment)与初始化(initialization),通常后者的效率更高,初始化通过成员初值列表。
最好以申明次序作为成员列表中的次序。
Singleton模式的一个应用:定义于不同编译单元的non-local static对象的初始化次序
class FileSystem { ... }; // as before FileSystem& tfs() // this replaces the tfs object; it could be { // static in the FileSystem class static FileSystem fs; // define and initialize a local static object return fs; // return a reference to it } class Directory { ... }; // as before Directory::Directory( params ) // as before, except references to tfs are { // now to tfs() ... std::size_t disks = tfs().numDisks(); ... } Directory& tempDir() // this replaces the tempDir object; it { // could be static in the Directory class static Directory td; // define/initialize local static object return td; // return reference to it }
即以local static对象代替non-local static对象
二、构造、析构、赋值运算
Item5. 了解C++默默编写并调用了哪些函数
这些是C++会默认生成的(如果你没有定义):copy构造、copy assignment、析构(non-virtual)、default构造,所有这些都是public而inline的。
(注:上面的析构(non-virtual),除非其base class是虚析构)
Item6. 若不想使用编译器自动生成的函数,就该明确拒绝
TODO