什么时候空类不再是一个空类呢?当C++处理过它之后。
如果你打算在一个“内含引用成员”的class内支持赋值操作,你必须自己定义拷贝赋值操作符。面对“内含const成员”的classes,编译器的反应也一样。
请记住 :
通常如果你不希望类支持某一特定的功能,只要不声明对应的函数就是了,但这个操作对拷贝构造函数和拷贝赋值操作符却不起作用,因为条款05:已经指出了,如果你不声明它们,而某些人尝试调用它们,编译器会为你声明它们。
我们的解决办法是将拷贝构造函数和拷贝赋值操作符声明为private,但这个做法并不绝对安全,因为成员函数以及friend还是可以调用private函数。
我们实现一个专门为了阻止copying动作而设计的基类
class uncopyable {
protected:
Uncopyable(){} //允许派生对象构造和析构
~Uncopyable(){}
private:
Uncopyable(cosnt Uncopyable&); //但阻止copying
Uncopyable& operator=(const uncopyable&);
}
为了阻止A对象被拷贝,我们唯一需要做的就是继承Uncopyable:
class A:private Uncopyable{ //类不再声明拷贝构造函数或拷贝赋值操作符
...
};
这行得通,任何人——甚至是成员函数或友元函数尝试拷贝A对象,编译器试着生成拷贝构造函数和一个拷贝赋值操作符。正如条款12所说:这些函数的“编译器生成版”会尝试调用其基类的对应兄弟,那些调用会被拒绝,因为其基类的拷贝函数是private。