条款06:若不想使用编译器自动生成的函数,就该明确拒绝
阻止拷贝的关键是:由于所有编译器产出的函数都是public,可以将拷贝构造函数和拷贝运算符声明为private。明确声明一个成员函数,可以阻止编译器自动创建其专属版本,而令这些函数为private,可以阻止用户调用它。
class Home { private: Home &operator = (const Home &rhs); Home(const Home &rhs); };当用户拷贝Home对象,编译器会报错。
为阻止拷贝动作而设计的基类
class Uncopy { protected: Uncopy () { } //允许派生类对象构造和析构 ~ Uncopy () { } private: Uncopy &operator = (const Uncopy &rhs); //拷贝运算符 Uncopy (const Uncopy &rhs); //拷贝构造函数 };
class Home: private Uncopy{ // Home对象禁止被拷贝 };禁止用户拷贝Home对象时,继承Uncopy类。试图拷贝Home对象时,编译器便试着生成一个拷贝构造函数和拷贝操作符,这些函数尝试调用其基类对应的函数,这些调用会被拒绝,因为基类的拷贝函数是private。