我有一个我定义的课程:
operator +(Class& obj)
添加两个对象。 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;
问题:
在operator +()
的正文中,return tmp;
我看到它调用了我的复制构造函数。是 Base 类型的 tmp 是否存储在内部编译器生成的临时对象中(例如Base compiler_tmp = tmp),因此调用了复制构造函数?
如果是,那么我想它应该代表表达式obj3=obj1+obj2;
的RHS,并且应该在此语句的末尾调用析构函数。
我的上述假设是否正确?或者我在这里错过了一点?
答案 0 :(得分:1)
问题是双重的。有语义复制构造,真正的复制构造和移动构造(你没有定义)。在语义上,您在函数执行过程中调用了以下复制构造函数:
现在,复制省略技术开始发挥作用。根据您的编译器,您可能会有任意数量的未调用的复制构造函数。
答案 1 :(得分:0)
是。 operator+
因为您返回Base
的新实例而调用了复制构造函数。
右。