方法;
Sterling operator+(const Sterling& o) const {
return Sterling(*this) += o;
}
这行“Sterling(* this)+ = o”是否在堆栈内存中创建一个新对象?如果为true,它如何将堆栈中的对象返回到方法之外?
我可以这样做:
Sterling operator+(const Sterling& o) const {
return *this += o;
}
因为我认为*这是一个对象所以我们不需要创建一个新的对象?
答案 0 :(得分:7)
Sterling operator+(const Sterling& o) const {
return Sterling(*this) += o;
}
在堆栈上创建对象 ,但实际上并没有返回此对象,而是返回它的副本。这个功能确实:
operator+=
o
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+
)
答案 1 :(得分:2)
下面:
Sterling operator+(const Sterling& o) const {
return Sterling(*this) += o;
}
创建临时(是,新)对象(在堆栈上,或者更严格地说,在自动存储中),然后更改临时对象并从函数返回其副本(以某种实现定义的方式)。
这里:
Sterling operator+(const Sterling& o) const {
return *this += o;
}
更改当前对象(调用该方法的对象),然后从该函数返回其副本。
所以主要区别在于当前对象是被改变还是是临时对象。在这两种情况下,都会复制并从函数返回更改后的对象。
答案 2 :(得分:1)
在您的示例中,Sterling
作为按值传递对象返回 - 它存储在堆栈中(或寄存器,无论编译器选择哪种方式存储它)