条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
如果你是一个地产商,一个中介软件系统自然而然的想有一个class来描述一个房屋。
Class HomeForSale{…};
每一个地产商,都会说自己的房子是独一无二的,所以不允许别人复制或赋值。
也就是说:
HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1); // 企图拷贝h1,不应该通过编译
H1 = h2; //企图赋值h1,不应该通过编译
这时我们要如何去做呢?
如果我们不定义copy 构造函数或赋值构造函数,则编译器会为我们生成。那么这时我们要怎么办呢?
有一个办法,我们把copy 构造函数或赋值构造函数定义为私有的。
但是问题来了,虽然为私有的,对象不能访问,但是类的友元和成员函数是可以访问的。怎么办?我们只声明不定义。这样如果在友元或成员函数中使用copy 构造函数或赋值构造函数时,会出现一个连接错误。
class HomeForSales{
public :
...
private:
HomeForSales(const HomeForSales& ); //想想为什么不写形参的名字?
HomeForSales& operator= (const HomeForSales&);
}
再想,我们是不是可以把这种错误由连接时期提前到编译时期呢?
是可以的。
我们可以定义这样一个类,做为一个基类。
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator= (const Uncopyable& );
}
class HomeForSales : public Uncopyable{…}