对象在返回之前被销毁
The object is destroyed before being returned
我不明白为什么当我的一个方法返回一个对象时,这个对象将被销毁。
把类的结构和方法贴在这里。
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(返回值优化),但这是另一回事。
相关文章:
- 如何返回对象C++的数组
- 如何使用std::min和std::less返回对象
- 如何通过引用返回对象
- 如何安全地从 DLL 调用返回对象
- 如何在不销毁对象的情况下返回对象列表
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 使用返回对象的函数处理错误
- 何时返回指针与返回对象的一般经验法则?
- 如何使用运算符+重载函数正确返回对象?
- C++,class,一个返回对象的函数
- 运算符的返回对象 = C++ 中的重载
- 从队列返回对象的最快方法,但前提是队列有它
- 如何使用条件表达式返回对象指针?
- 使用构造函数从函数返回对象
- 隐式转换函数的返回对象时是否会影响性能?
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 按值和堆栈大小限制返回对象
- 我应该如何从函数返回对象?
- c++:何时传递指针与返回对象
- 返回对象会丢失属性