2013-08-19 65 views
3

我在C背景,並試圖瞭解這意味着什麼:勘定/初始化引用

void f(const string &x = "hello") { 
} 

如果不傳入爲x設置爲默認值? 「你好」在哪裏?

+0

您可能對[Accelerated C++](http://www.informit.com/store/accelerated-c-plus-plus-practical-programming-by-example-9780201703535)感興趣。 – chris

回答

2

它被稱爲默認參數,如果您訪問this link,您將瞭解到這些參數。

默認參數是一個函數參數,其中提供了默認值 。如果用戶不提供此參數的值,則將使用默認值。如果用戶確實爲默認參數提供了 值,則使用用戶提供的值。

所以,如果你叫f這樣的 -

f(); 

然後x將包含hello,但如果你這樣稱呼它 -

f("test"); 

然後x將包含test

+1

@Prime:那是一個錯字。修復。 –

6

您的參數(x)在調用函數的上下文中創建/初始化。字符串文字「hello」具有靜態存儲持續時間。

該標準沒有指定存儲其中任何一種存儲器的形式,但在通常情況下,字符串文字將駐留在直接從可執行文件中的數據初始化的一些存儲器中,並且x將在堆棧上創建(如果你不在其他地方傳遞其他東西,則傳遞的文件的地址將被初始化)。

0

這個參數聲明等效於以下更明確的一個

void f(const string &x = string("hello")) 

你是正確的:在=(所謂默認參數)之後的部分,當函數被調用時沒有明確的說法,使用,如在

f(); 

在這種情況下string類型的臨時對象從"hello"初始化構造,然後用於作爲參考的初始化程序x。該臨時的建設調用代碼,這意味着的背景下進行的,上面的調用等效於

f(string("hello")); 

要回答你的問題有關"hello""hello"是一個字符串,其具有靜態存儲持續時間(即它駐留在靜態內存中,就像在C中一樣)。但是請注意,在本例中,它不是"hello"本身,它被用作參考的初始化程序。在這種情況下,編譯器會爲此目的隱式創建一個短暫的無名暫時對象,如我上面的示例中明確闡述的那樣。