对象在返回之前被销毁

The object is destroyed before being returned

本文关键字:返回 对象      更新时间:2023-10-16

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

把类的结构和方法贴在这里。

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

有人知道为什么吗?

tmp变量在它的作用域中存在…所以它只存在于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 +=,并且3返回值是改变后的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(返回值优化),但这是另一回事。