我无法理解为什么当我的方法返回一个对象时,该对象将被销毁。
在这里发布课程结构和方法。
class Var
{
public:
Var operator += (const Var& var);
private:
Var _operation(Var* var, VAR_OPERATOR op);
}
方法:
Var Var::operator += (const Var& var)
{
Var tmp = this->_operation((Var *)&var,VAR_ADD);
return tmp; // here the tmp variable is void
}
Var Var::_operation(Var* var, VAR_OPERATOR op)
{
Var tmp;
// operations
// here the tmp variable has value
return tmp;
}
任何人都知道为什么?
答案 0 :(得分:1)
tmp Var存在于其范围内......因此它仅存在于operator + =和_operation中。当tmp超出范围时,将调用析构函数。正确的方法是:
Var& Var::operator += (const Var& var)
{
_operation(*this, &var, *this, VAR_ADD);
return *this;
}
void Var::_operation(const Var& lhs, const Var& rhs, Var& res, VAR_OPERATOR op)
{
res == ...
// operations
// here the tmp variable has value
}
使用+ =运算符我们的意思是内部数据会改变(在这种情况下是* this + = val),所以这里没有返回类型,或者我们可以返回* this,这样的情况如下:
( v += val ) - val2;
v += val
中的将被称为operator +=
,而wa返回是已更改的v,现在如果我们定义 - 运算符如friend Val operator - ( const Val& lhs, const Val& rhs )
我们可以有连接的表达式。
您要做的是:
Var Var::operator + (const Var& var1, const Var& var2)
{
Var tmp;
// internal stuff
return tmp;
}
现在这个运营商可以成为朋友
friend Var operator + (const Var& var1, const Var& var2)
{
Var tmp;
// internal stuff
return tmp;
}
这仍然是错误的,因为我们需要定义复制构造函数和赋值运算符!因为temp确实会被销毁,但首先我们可以以一种“克隆”方式调用复制构造函数(或分配运算符)。
所有现代C ++编译器都允许一个名为RVO(返回值优化)的东西,但这是另一个故事。