当你不想class支持某一特定机能,只要不声明对应的函数就是了。但是这个策略对copy构造函数和copy assignment操作符却不起作用,因为你不声明它们时,而某些尝试调用它们,编译器会自动生成。
所有编译器产出的函数都是public。为阻止这些函数被创建出来,你可以将copy构造函数或copy assignment操作符声明为private。阻止了编译器暗自创建其专属版本;而令这些函数为private,也可以成功阻止人们调用它。
但这个做法并不安全,因为成员函数和friend函数还是可以调用你的private函数。我们可以“将成员函数声明为private而且故意不实现它们”。那么某些人在不慎调用任何一个,会获得一个连接错误。例:
class HomeForSale
{
public:
...
private:
HomeForSale(const HomeForSale&); //只声明
HomeForSale& operator=(const HomeForSale&);
};
将链接期错误移至编译器是可能的,只要将copy构造函数和copy assignment操作符声明为private就可以办到,但不是在HomeForSale自身,而是在一个专门为了阻止copying动作而设计的base class内:
class Uncopyable
{
protected:
Uncopyable(){} //允许derived对象构造和析构
~Uncopyable(){}
private:
Uncopyable(const Uncopyalbe&); //阻止copying和copy assignment
Uncopyable& operator=(const Uncopyable&);
};
为阻止HomeForSale对象被拷贝。我们只需继承Uncopyable:
class HomeForSale: private Uncopyable
{
}
结论:为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。