gpt4 book ai didi

c++ - 对象在返回之前被销毁

转载 作者:行者123 更新时间:2023-11-28 07:33:16 25 4
gpt4 key购买 nike

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

在这里发布类结构和方法。

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 Var 存在于它的范围内……所以它只存在于运算符 += 和 _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 += 并且返回的是更改后的 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 了

friend Var operator + (const Var& var1, const Var& var2)
{
Var tmp;
// internal stuff
return tmp;
}

这仍然是错误的,因为我们需要定义复制构造函数和赋值运算符!因为 temp 确实会被销毁,但首先我们可以以一种我们可以拥有“克隆”的方式调用复制构造函数(或赋值运算符)。

所有现代 C++ 编译器都允许称为 RVO(返回值优化)的东西,但这是另一回事。

关于c++ - 对象在返回之前被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17235589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com