2011-05-18 111 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; 
} 

當前對象(在其上調用方法的那個)被改變,那麼它的副本從函數返回。

所以主要的區別是當前對象是否被修改或是臨時對象。在這兩種情況下,修改後的對象都會被複制並從函數中返回。