对于一个class而言,如果你不希望支持某个特定机能,只要不声明对应函数就是了,但是这个策略对于C++编译器会默默给你生成的函数(default构造函数、析构函数、copy构造函数和copy assignment操作符)而言却不起作用,如果你不声明它们,而某些人尝试调用,编译器就会为你声明它们。
如果你要阻止这些行为:因为编译器产出的函数都是public,为了阻住它们,你可以将其声明为private。但这个方法不是绝对安全的,因为member函数和friend函数还是可以调用private函数。所以将函数声明为private而且故意不去实现它们(C++11可以声明为delete即可)。例如标准库例的ios_base、basic_ios和sentry,其copy构造函数和copy assignment操作符都被声明为private而且没有定义。
你可以专门设计一个类来专门阻止copying动作二设计的base class内,然后再继承于这个class:
class UnCopyable
{
protected:
UnCopyable(){}
~UnCopyable(){}
private:
UnCopyable(const UnCopyable&); //阻止copying
UnCopyable& operator=(const UnCopyable&);
};
//阻止对象拷贝,唯一要做的就是集成UnCopyable
class HomeForSale : public UnCopyable //class不再什么copy构造函数
{ //或copy assignment操作符
...
};
总结
- 为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。像上述UnCopyable这样的基类也是一种做法(C++11直接将其声明为delete即可)。