2012-09-20 85 views
0

本質參考,有什麼區別:返回對象與在默認構造函數簽名

const Date& default_date() 
{ 
    static Date dd(2001,Date::Jan,1); 
    return dd; 
} 

const Date default_date() 
{ 
    static Date dd(2001,Date::Jan,1); 
    return dd; 
} 

是否函數簽名真的重要嗎?我不認爲日期&是* Date的類型,所以我不確定這會產生多大的差異。它是否只是防止在退貨上製作副本?但是,那麼你不會返回& dd?

+3

(那些是構造函數?) – 2012-09-20 05:15:16

+0

這樣的聲音將幫助你:http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in -c – chris

+0

常量或不,我永遠不會使用&運算符從函數內部返回任何東西?如果你在外面分配它,否則大代碼庫中的某個人最終會刪除const,並且你的應用程序以可怕的segvaults結束 –

回答

3

第一個函數返回一個常量引用靜態對象,所以你可以這樣做:

const Date& d = default_date(); // d is a reference to the original 

Date d = default_date(); // d is a copy of the original, 
         // provided there is a copy constructor 

第二個使static Date對象的副本,讓你只能獲得副本

Date d = default_date(); // d is a copy of the original 

返回&dd會返回靜態對象的地址,然後可以將其分配給指向Date的指針。 return語句的語法與通過引用返回或按值返回的語法相同。語義取決於函數的返回類型。

請注意,在C++中,諸如default_date之類的函數不被稱爲構造函數。

+0

在前者中,我認爲你錯過了一個'='符號,因爲它不是按原樣編譯的。在後者中,沒有複製構造函數的臨時條件,因爲沒有一個(默認或其他)代碼將不會編譯。剩下的我完全落後(並且投票)。 – WhozCraig

+0

@CraigNelson謝謝,別人修正了這個錯誤。我沒有爲後面的例子添加複製構造函數的顯式條件,因爲如果沒有它,函數本身就不能編譯。 – juanchopanza

相關問題