了解 C++ 默认编写的函数
空的类,在C++处理过后,编译器会为它声明
- 默认构造函数
- copy 构造函数
- copy assignment 操作符
- 析构函数
并且这些函数都是 public 且 inline 的。
class Empty {};
class Empty {
public:
Empty() {...} // 默认构造函数
Empty(const Empty &rhs) {...} // 拷贝构造函数
~Empty() {...} // 析构函数
Empty& operator =(const Empty& rhs) {...} // copy assignment 操作符
};
Empty e1; // 默认构造函数
Empty e2(e1); // copy 构造函数
e2 = e1; // copy assignment 操作符
这些函数做些什么:
- 构造函数:调用 base classes 和 non-static 成员变量的构造和析构函数 (## 编译器产生的析构函数是 non-virtual 的)
- copy 和 copy assignment 函数将来源对象的每一个 non-static 成员变量拷贝到目标对象
对于copy构造函数:string 成员变量会调用 string 的 copy 构造函数,NamedObject<int>::m_tObjectValue 的类型是int,则会"拷贝每一个bits"来完成初始化
编译器生出 operator= 有两个条件:
- class 里面不含有 "引用成员"
- 如果某个 base class 将 copy assignment 操作符声明为 private, 编译器将拒绝为其 derived classes 生成一个 copy assignment 操作符
防止自动生成拷贝构造函数
- 编译器自动生成的函数全部是public,并且是按照固定的机制实现的,所以有些时候我们不能让它自动生成
- 为拷贝构造函数和 copy assignment 写一个 private 函数,防止生成,然而这时候还会碰到 friend 和 member 函数中可以使用
- 设计一个专门阻止 copying 动作的 base class
class Uncopyable {
protected:
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
class A : private Uncopyable {
...
};