【问题标题】:what 's difference between copy construct function and = operator复制构造函数和 = 运算符有什么区别
【发布时间】:2013-06-26 09:26:18
【问题描述】:

我写了一个简单的代码,我的问题是:为什么item_base只是调用constrcut函数?应该item_base调用“复制构造函数”吗?我观察到当我创建item_base2时,它调用了“复制构造函数”,但item_base没有调用“复制构造函数”,有什么区别?

class Item_base {
    public:
        Item_base();
        Item_base(int);
        Item_base(const Item_base &base);
        void operator=(const Item_base &item);
        virtual ~Item_base();
};

Item_base::Item_base()
{
    cout << "construct function" << endl;
}

Item_base::Item_base(int a)
{
    cout << "arg construct function" << endl;
}
Item_base::Item_base(const Item_base &base)
{
    cout << "copy function" << endl;
}

void Item_base::operator=(const Item_base &item)
{
    cout << "= operator" << endl;
}

Item_base::~Item_base()
{
}


int main()
{
    //cout << "Hello world!" << endl;
    Item_base item_base = Item_base(1);//construct function
    Item_base item_base2 = item_base;//copy construct  function
    Item_base item_base3;
    item_base3 = item_base2;// =operator function
    return 0;
}

【问题讨论】:

标签: c++


【解决方案1】:

它被称为“复制省略”或“复制构造省略”。 C++ 标准允许实现省略某些副本。从临时对象Item_base(1) 到变量item_base 的副本就是这样的副本。

这同样适用于 C++11 中的移动。

因此,当您定义item_base 时,在您的实现中它只是使用参数1 构造,而不是临时构造然后复制。所有有价值的编译器都实现了复制省略,尽管如果你用编译器选项禁用它,你会看到这里调用了两个构造函数。

定义item_base2时,必须复制item_base,因为没有其他方法可以初始化item_base2

当您定义 item_base3 时,它是不带参数构造的。

当您分配给item_base3 时,它已经存在,因此当然没有构造。调用赋值运算符。

【讨论】:

    【解决方案2】:

    item_base 不要使用复制构造函数,因为对象已经构造了。 你只是分配item_base3,你没有重新创建它。

    【讨论】:

      【解决方案3】:

      copy 构造函数在您将已构造的对象COPY 到另一个正在创建的NEW 对象时调用。调用是隐式的。

      Item_base z;
      Item_base x = z; //Copying `z` into `x`
      

      赋值运算符用于显式赋值。施工时不一定;

      Item_base y;
      y = x;
      

      【讨论】:

        【解决方案4】:

        为了完全清楚,复制构造函数同时调用

        Item_base a2 = a1;
        
        Item_base a2(a1);
        

        也不调用赋值运算符。

        【讨论】:

          【解决方案5】:

          复制构造函数通过使用现有对象来处理创建新对象,而赋值运算符在两个现有对象之间工作,即只是将一个对象的值分配给另一个对象。

          例如:(复制构造函数)

          Item_base ib1;
          Item_base ib2 = ib1; or Item_base ib2(ib1);
          

          例如:(赋值运算符)

          Item_base ib1;
          Item_base ib2
          ib1=ib2;
          

          【讨论】:

            猜你喜欢
            • 2012-07-27
            • 2014-05-18
            • 2015-03-03
            • 2016-04-28
            • 2011-01-02
            • 1970-01-01
            • 1970-01-01
            • 2019-08-30
            • 1970-01-01
            相关资源
            最近更新 更多