条款05:Know what functions C++ silently writes and calls
1. 对一个空类,C++默认生成构造,析构,拷贝构造,和赋值(operate=)函数
2. 这些函数并不一定生成,而是在需要时,才会被编译器创建出来。
3. 默认的拷贝构造和赋值函数只能实现简单的拷贝,对引用或const成员变量需要自己实现拷贝构造和赋值函数。
条款06: 若不想使用默认函数,明确的拒绝
1.通过将拷贝构造,赋值等函数声明为private来避免编译器默认构造和用户调用,如
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&); // declarations only
HomeForSale& operator=(const HomeForSale&);
};
但这样还不能避免成员函数或friend函数的访问,为此可以使用这样的基类:
class Uncopyable {
protected: // allow construction
Uncopyable() {} // and destruction of
~Uncopyable() {} // derived objects...
private:
Uncopyable(const Uncopyable&); // ...but prevent copying
Uncopyable& operator=(const Uncopyable&);
};
为了阻止拷贝 HomeForSale objects(对象),我们现在必须让它从 Uncopyable 继承:
class HomeForSale: private Uncopyable { // class no longer
... // declares copy ctor or
}; // copy assign. operator
这样就能避免任何对HomeFroSale的拷贝构造和赋值操作。
更多的问题:
Uncopyable 的实现和使用包含一些微妙之处,比如,从 Uncopyable 继承不必是 public(公有)的(参见 Item 32 和 39),而且 Uncopyable 的 destructor(析构函数)不必是 virtual(虚拟)的(参见 Item 7)。因为 Uncopyable 不包含数据,所以它符合 Item 39 描述的 empty base class optimization(空基类优化)的条件,但因为它是 base class(基类),此项技术的应用不能引入 multiple inheritance(多继承)(参见 Item 40)。反过来说,multiple inheritance(多继承)有时会使 empty base class optimization(空基类优化)失效(还是参见 Item 39)。
条款07:为多态基类声明virtual析构函数
1. 因为 C++ 规定:当一个 derived class object(派生类对象)经由一个 base class的指针被删除,而该base class带有一个non virtual的析构函数,则结果是未定义的。运行时比较典型的后果是 derived part of the object(这个对象的派生部分)不会被析构。
2. 当一个类不意图被用作一个base class的时候,不用设析构为virtual(为了避免引入不必要的vtbl)
如果一个类不想被实例化,但又要被当成base class,可以为其提供一个纯虚的析构函数。
这是一个例子:
class AWOV { // AWOV = "Abstract w/o Virtuals"
public:
virtual ~AWOV() = 0; // declare pure virtual destructor
};
但请注意,必须为 pure virtual destructor(纯虚拟析构函数)提供一个 definition(定义):
AWOV::~AWOV() {} // definition of pure virtual dtor
3. 如果一个类包含任何virtual函数,那应该将其析构设为virtual;