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

  • 相关阅读:
    Java--强制转化
    Java--成绩分类
    建造者模式的应用
    抽象工厂模式的应用
    工厂模式
    第几天
    Stacking Plates(存档待续.....(没有写思路和程序))
    圆的面积
    公孙策和陆湘湘对话(少年包青天第二部第二十集末尾和第二十一集开头部分)
    简单接口回调例子
  • 原文地址:https://www.cnblogs.com/loveyakamoz/p/2772376.html
Copyright © 2020-2023  润新知