结论1:为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。
一般而言这个做法并不绝对安全,因为member函数和friend函数还可以调用private函数,此时可以将copy构造函数和copy assignment操作符声明在一个专门为了阻止coping动作而设计的base class内。
例如:
class Uncopyable {
protected://允许derived对象构造和析构
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable &);//但阻止coping
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale : private Uncopyable {
...
};
当尝试复制HomeForSale对象时,编译器便生成一个copy构造函数和一个copy assignment操作符,这些函数会尝试调用其base class的对应函数,那些调用则会被编译器拒绝,因为其base class的对应函数为private的。