在堆和堆栈内存中的对象之间混淆

时间:2011-05-18 10:04:02

标签: c++

方法;

        Sterling operator+(const Sterling& o) const {
           return Sterling(*this) += o;
         }

这行“Sterling(* this)+ = o”是否在堆栈内存中创建一个新对象?如果为true,它如何将堆栈中的对象返回到方法之外?

我可以这样做:

         Sterling operator+(const Sterling& o) const {
           return *this += o;
         }

因为我认为*这是一个对象所以我们不需要创建一个新的对象?

3 个答案:

答案 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作为按值传递对象返回 - 它存储在堆栈中(或寄存器,无论编译器选择哪种方式存储它)