在条款5中已经提到,编译器会默默的给你生成复制构造函数和赋值运算符函数。
但如果我们希望每一个对象都是独一无二的,不希望看到拷贝动作的出现。又该怎么做呢?
解决的关键在编译器生成的函数都是public,而只要我们将这两个拷贝函数声明为private,但却不去定义它们,就可以避免编译器为我们自动生成,用户也无法拷贝。
所以即使其他成员函数和友元函数还是可以调用类的private函数,会出现连接错误,在C++中的iostream库中,就是这样处理的。
而有一种做法则可以将这个错误从连接期提前至编译器。就是将其声明为private后,专门为了阻止copying动作而设计的基类中。
结合下面代码理解:
class Uncopyable
{
protected:
Uncopyable(); //允许派生对象构造和析构
~Uncopyable();
private:
Uncopyable(const Uncopyable&); //阻止copying行为
Uncopyable& operator=(const Uncopyable&);
};
class Test: private Uncopyable
{ //class不在声明复制构造函数和赋值运算符
……
};
在上面的这种方法中,编译器生成的复制构造函数和赋值运算符函数,是调用基类的这两个函数,但是由于权限不够,而在编译器报错,达到了我们想要的效果。
请记住:
为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。使用像uncopyable这样的base class也是一种做法。