《Effective C++》Note

Item 1

C++ is big

Item 20

const &
相对于直接传值带来效率的提高
避免多余的构造和析构
避免slicing(对象分割),派生类不会由基类复制构造产生,故也保留了本身的性质
对于内置类型以及STL迭代器和函数对象时,习惯上都被设计为传值

Item 21

return object;
stack / heap 避免调用构造函数

1
2
3
4
inline const Rational operator * (..)
{
return Rational(..); // Just return a new object
}

Item 3

const
常量 参数 返回值 成员函数
bitwise constness / logical constness (mutable)
casting away constness

1
2
3
non_const{
const_cast<>(const())
}

Item 2

const, enum, inline > #define
class专属常量

1
2
3
4
class x{
static const int NumTurns; // Declaration
}
const int x::NumTurns = 1; // Definition

enum hack
宏函数 —> template inline

1
2
3
4
5
template<typename T>
inline void callWithMax(const T& s, const T& b)
{
f(a > b ? a : b);
}

Item 7

多态基类 virtual ~()
避免基类的析构无法把派生类的一些内容清除
vptr

Item 24

Item 34

接口继承 和 实现继承

Item 4

Initialization
成员初值列
non-local static 单例模式

Item 5 & Item 6

1
2
3
4
5
6
7
8
class Empty{
public:
Empty() {...}
Empty(const Empty& rhs) {...}
~Empty() {...}

Empty& operator=(const Empty& rhs) {...}
}

在没有reference以及const等条件限制下,编译器会自动生成这些函数,但是如果不想这些生成,则应该通过private或单独设计一个base class等方式不去定义

1
2
3
4
5
6
7
8
class Uncopyable{
protected:
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};

Item 8

不要让析构函数抛出异常

Item 23

愈多东西被封装,愈少人可以看到它,我们就有愈大的弹性去变化它。
相同机能的member函数(可以访问private,enums,typedefs等)和non-member函数之间,non-member(non-friend)的封装性更好。当然non-member只是针对所在类而言,对其他类没有关系。
自然的做法是放在同一个命名空间中。

Item 31

编译依存关系
声明式 定义式
Handle class
Interface class

Item 18

Item 36

Item 54

Item 13

The C++ Programming Language

  • 函数对象
  • 灵巧指针
  • 显式构造函数