如果不希望class支持某一成员函数,那么不声明和定义它就可以了,但是这一策略对与拷贝构造函数和重载赋值操作符并不起作用。因为如果不声明它们,那么当尝试调用它们的时候,编译器会为你声明和定义它们。这显然不是你所希望看到的。
缺陷:编译器自动生成的函数都是public声明一个函数可以阻止编译器自动生成该函数令这个函数为private可以阻止人们调用它
member函数或friend函数可以调用它们,导致链接错误。Demo:
class HomeForSale { public: ... ... private: ... HomeForSale(const HomeForSale&); HomeForSale& operator=(const HomeForSale&); };
class Uncopyable { protected: Uncopy() {} ~Uncopy() {} private: Uncopyable (const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; // 为了阻止编译的自动生成,我们唯一需要做的就是继承Uncopyable class HomeForSale: private Uncopyable { ...... };
原理:
小结:当尝试拷贝操作时,编译器会尝试调用父类的对应的拷贝构造函数和重载赋值操作符,这些调用会被编译器拒绝,因为其base class的拷贝函数是private从而报出编译错误。