该对象在返回之前被销毁

时间:2013-06-21 12:45:59

标签: c++ oop

我无法理解为什么当我的方法返回一个对象时,该对象将被销毁。

在这里发布课程结构和方法。

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;
}

任何人都知道为什么?

1 个答案:

答案 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(返回值优化)的东西,但这是另一个故事。