【发布时间】:2015-09-17 14:53:36
【问题描述】:
我有一个我已经定义的类:
- 构造函数
- 析构函数
- 复制构造函数
- 赋值运算符
-
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;
}
如果在我的主函数中创建三个对象。应该有三个析构函数调用:
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,并且应该在该语句的末尾调用析构函数。
我的上述假设是否正确?或者我在这里遗漏了一点?
【问题讨论】:
-
相关 - stackoverflow.com/questions/12953127/… - 可能是骗子?
-
有点题外话:为什么你没有在你的 operator + 实现中通过 const 引用传递 obj2?运算符函数本身也应标记为 const,因为在实例上调用运算符没有理由必须修改该实例。
-
@antred:是的,编写 const & 是一种很好的编程习惯。但不是规则。我只是在尝试所有组合,以查看何时调用复制构造函数以及何时(以及哪一点)调用析构函数。因此,您可以在收集时按值或地址传递,您可以按值或通过 ref 或通过 const ref 收集它。
-
@antred:因为它是一个local variable,在
operator+返回后可能会被销毁。因此,您最终可能会引用一个不再存在的变量。 -
@Gombat,@antred 谈论通过引用传递
obj2,而不是通过引用返回。
标签: c++