2011-05-18 143 views
3

一种方法;堆中的对象与堆栈内存之间的混淆

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

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

我可以这样做:

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

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

回答

7
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+

1

在您的例子,Sterling返回为一个通过噪声值对象 - 它被存储在栈上(或寄存器,无论怎样的编译器选择来存储它)。

2

这里:

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

一个临时的(是的,新的)对象被创建(堆栈,或更严格地说,在自动存储),然后临时对象改变其副本从函数返回(在某些实现中定义的方式)。

这里:

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

当前对象(在其上调用方法的那个)被改变,那么它的副本从函数返回。

所以主要的区别是当前对象是否被修改或是临时对象。在这两种情况下,修改后的对象都会被复制并从函数中返回。