条款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{…}

posted @ 2012-11-15 22:28  loveyakamoz  阅读(189)  评论(0编辑  收藏  举报