2012-02-13 45 views
4

我想知道的邏輯在這個函數聲明:C++初學者:如果使用「const」,通過引用使用變量有什麼意義?

CMyException (const std::string & Libelle = std::string(),... 

什麼是使用一個變量引用的點?通常情況下,只要可能在內部被修改,就通過引用傳遞變量...所以如果您使用關鍵字const,這意味着它永遠不會被修改。

這是矛盾的。

可能有人向我解釋這個嗎?

+0

@iammilind:通過const引用傳遞數字有點笨手笨腳,複製它們更容易... – 2012-02-13 08:49:03

回答

5

其實參考用於避免不必要的對象副本。

現在明白爲什麼使用const,試試這個:

std::string & x= std::string(); //error 

它會給編譯錯誤。這是因爲表達式std::string()創建了一個不能綁定到非const引用的臨時對象。然而,臨時可以綁定到const參考,這就是爲什麼需要const

const std::string & x = std::string(); //ok 

現在回來的構造函數代碼:

CMyException (const std::string & Libelle = std::string()); 

它設置參數的默認值。默認值是在臨時對象之外創建的。因此,您需要const(如果您使用參考)。

還有一個優勢,在使用常量參考:如果您在這樣的構造,那麼你就可以提高例外是這樣的:

throw CMyException("error"); 

它創建std::string類型的臨時對象出來的字符串文字"error",並且該臨時文件綁定到const參考。

+0

+1用於指出爲了綁定臨時對象需要'const' – Sanish 2012-02-13 09:31:24

3

一些參數可能會使用相當多的內存。如果你傳遞一個參數作爲值,它將被複制並且副本將被傳遞給該方法。

將它們作爲參考傳遞只會將指針傳遞給速度更快的方法並保存副本的內存。

1

例如,你只能與常引用argumernt做到這一點:

CMyException("foo"); 

想想它,然後它會變得清晰。

+1

C++ 11的右值引用會喜歡與你一個單詞。 :) – Xeo 2012-02-13 08:36:37

+0

@Xeo仍然沒有設法進入。但是,是的,你是對的。 – Anycorn 2012-02-13 09:04:47

1

通過const引用傳遞基元類型(int,char,..)沒有意義。即使對於std::string我也會認爲這不是必需的。

但是,較大的結構或類在傳值時需要一個副本,所以在那裏有開銷。 A const引用模擬傳值的行爲(外部變量未被修改),但也阻止了額外的副本。

+3

對於std :: string,它非常重新推薦,因此不會不必要地調用CTOR和DTOR。 – Ajay 2012-02-13 08:27:20

+0

我實際上想知道:通過引用傳遞一個原語會比通過值傳遞更慢或更麻煩嗎?這樣做似乎是「多餘的」,但對於固定呼叫約定還有一些要說的。 – KillianDS 2012-02-13 09:04:39

+0

通過const引用傳遞任何東西都可以被認爲是不成熟的優化。永遠不要少,規則「通過const引用傳遞類的類型,其他類型的值」似乎無處不在。這是遵循它的有效原因。 – 2012-02-13 09:08:10

0

不。每當你傳遞任何變量作爲參考時,並不總是必要的,只有這樣它纔可以在裏面修改。如果變量是通過值傳遞的,那麼只要調用該函數就會創建一個變量副本。

另一方面,引用變量使用相同的對象,基本上只傳遞內存地址(與使用std :: string *相同,但不能使用空內存地址)。所以,當你這樣做const std::string& x,你的意思是:

1. The passed argument will not be copied. The same object will be used as in memory. 
2. The function will absolutely not modify the object that it is handling. 

如果你想想看,使用const是有道理的,當您與工作的參考,而不是其他。如果你正在製作一個我通過然後修改的變量的副本,那麼我真的不在乎。然而,如果你不打算修改我傳遞的對象(因爲你將使用同一個對象),我可以嚴格地進一步定義我的應用程序在此之下的過程保證。

0

我通常將所有內容都作爲const傳遞 - 我從不修改參數,通過引用自定義類型的基元類型的值。在大多數情況下,按原始類型值傳遞效率更高 - 根據指針大小考慮一個無符號的short-by值2個字節,參考4-8個字節。