在c ++中复制构造函数和临时对象

时间:2015-09-17 14:53:36

标签: c++

我有一个我定义的课程:

  1. 构造
  2. 析构
  3. 复制构造函数
  4. 作业运算符
  5. operator +(Class& obj)添加两个对象。
  6. operator+按值返回如下:

    Base operator +(Base& obj2)
    { 
        cout<<"+ operator called\n"; 
        Base tmp;
        tmp.x=x+obj2.x;
        tmp.y=y+obj2.y;
        return tmp;
    }
    

    如果在我的main函数中我创建了三个对象。应该有三个析构函数调用:

    Base obj1(1,2);
    Base obj2(1,2);
    Base obj3=obj1+obj2; 
    

    问题:

    1. operator +()的正文中,return tmp;我看到它调用了我的复制构造函数。是 Base 类型的 tmp 是否存储在内部编译器生成的临时对象中(例如Base compiler_tmp = tmp),因此调用了复制构造函数?

    2. 如果是,那么我想它应该代表表达式obj3=obj1+obj2;的RHS,并且应该在此语句的末尾调用析构函数。

    3. 我的上述假设是否正确?或者我在这里错过了一点?

2 个答案:

答案 0 :(得分:1)

问题是双重的。有语义复制构造,真正的复制构造和移动构造(你没有定义)。在语义上,您在函数执行过程中调用了以下复制构造函数:

  • 返回tmp;复制构造函数返回空间中的对象&#39; (无论是什么)来自你的tmp
  • 临时在obj3 =是从函数返回空间中的对象复制构造的
  • obj3是从临时
  • 复制构造的

现在,复制省略技术开始发挥作用。根据您的编译器,您可能会有任意数量的未调用的复制构造函数。

答案 1 :(得分:0)

  1. 是。 operator+因为您返回Base的新实例而调用了复制构造函数。

  2. 右。