0

我不明白为什么当我的方法返回一个对象时,该对象将被销毁。

在此处发布类结构和方法。

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

有谁知道为什么?

4

1 回答 1

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; 

inv += val将被调用operator +=,thre return 是更改后的 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(返回值优化)的东西,但这是另一回事。

于 2013-06-21T12:52:17.447 回答