一个方法;
Sterling operator+(const Sterling& o) const {
return Sterling(*this) += o;
}
“Sterling(*this) += o”这一行是否在堆栈内存中创建了一个新对象?如果为真,它如何将堆栈中的对象返回到方法外?
我可以这样做吗:
Sterling operator+(const Sterling& o) const {
return *this += o;
}
因为我认为 *this 是一个对象所以我们不需要创建一个新对象?
最佳答案
Sterling operator+(const Sterling& o) const {
return Sterling(*this) += o;
}
在堆栈上创建对象,但您实际上并没有返回该对象,而是返回了它的一个拷贝。这个函数做:
- 创建一个临时对象
- 用
o
调用临时对象的operator+=
- 返回结果的拷贝 - 注意
Sterling operator+(const Sterling& o) const
- 如果它是Sterling& operator+(const Sterling& o) const
( *注意&
* ),那么这将是一个问题)
无论如何,您的编译器可以通过使用 RVO 优化它并避免复制本地对象。
第二个问题:
Sterling operator+(const Sterling& o) const {
return *this += o;
}
这与第一个不同 - 第一个案例创建临时对象并更改它,然后返回它。如果您执行第二个操作,这将更改this
,然后返回它的拷贝。但请注意,this
对象已更改!
因此,总结 - 两者都返回相同的结果,但第二个改变了this
。 (如果你想重载 operator+=
而不是 operator+
,他会很有用)
关于c++ - 混淆堆内存和栈内存中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6042948/