这点属于一条技巧,主要针对于一些特定不允许实现拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)的场合。
举例说明,某个房地产公司所上架的房子没有重复的,因此在设计程序时,不允许将一座房子的信息拷贝给另一座房子,这就需要禁止使用拷贝构造函数和拷贝赋值运算符。
class HouseForSale{...};
HouseForSale h1;
HouseForSale h2;
HouseForSale h3(h2); // 企图拷贝h1——禁止执行
h1 = h2; // 企图拷贝h2——也要禁止执行
存在问题:
如果是其他功能函数,不想使用不声明不实现就可以了。但是对于以上这两个功能,即使你不声明不定义,编译器是会为该类自动生成的(条款05)。
解决方法:
因为编译器为类自动生成的函数都是共有(public)的,我们就可以把这些函数声明为私有(private),这样它的对象就无权调用。
其次,只声明不定义,因为如果有定义,本类和友元函数(friend functions)还是可以调用它们。
class House{
public:
....
private:
House(const House&); //只有声明,不要定义
House& operator=(const House&); //因为不会被用到,就不必再给参数想一个名字了
};
这种解决方法已经被大家所接受了,C++源码中也运用该方法。
更好的解决方案:
当一个父类将拷贝函数声明为私有时,编译器会拒绝为它的子类生成拷贝函数。
因此我们可以专门使用一个父类,在其中声明拷贝操作为私有,并让我们的类继承自它。
class Uncopyable{
protected:
Uncopyable(); // 允许 drived 对象构造和析构
~Uncopyable();
private:
Uncopyable(const Uncopyable&); // 将拷贝函数转移至私有
Uncopyable& operator=(const Uncopyable&);
};
// 为阻止 HomeForSale 对象被拷贝,需要继承 Uncopyable
class House:public Uncopyable{...}; // 公有继承
当不想让编译器为类自动生成某些函数时,把这些不想要的函数声明在此类的私有成员中,或者更好使用像如上例子的一个父类,并让我们的类公有继承。