2014-02-14 31 views
0

考慮下面的代碼:如何將字符串文字傳遞給在C++中處理的函數?

void consumeString(std::string str){ 
    /* some code */ 
} 

void passStringObject(){ 
    std::string stringObject = "string literal"; 
    consumeString(stringObject); 
} 

void passStringLiteral(){ 
    consumeString("string literal"); 
} 

現在考慮以下兩種情況:

1)函數passStringObject()被調用。

2)函數passStringLiteral()被調用。

在案例1我假設 - 內passStringObject調用函數consumeString時 - 變量stringObject只是傳遞給函數consumeString; string類的拷貝構造函數被調用,所以(因爲呼叫按價值)參數str是傳遞給函數consumeString的變量stringObject的副本。

但是,如果函數consumeString被調用,情況2會發生什麼?在調用複製構造函數並將「隱藏」變量的值複製到參數str之前,字符串類的(重載)賦值操作符(可能將文字賦值給背景中的某個「隱藏」變量?

+2

臨時的'std :: string'實例將被創建並在case 2中使用 –

回答

2

在情況2下,std::string(const char*)構造函數將在對象傳遞給consumeString之前被調用,該對象將複製臨時字符串對象。

0

在字符串文字的情況下,會創建一個臨時的std::string對象,然後將其複製到參數中。

0

String literals spawn temporary std::string objects。

臨時對象的生命週期綁定到創建它的C++指令。

std::string stringObject = "string literal";的情況下,調用const char*的構造函數來創建一個對象(不是臨時的)。

0

在情況1中,您是創建對象的人,並且調用該函數時,會調用字符串類的複製構造函數,並複製該字符串。

在第二種情況下,調用參數化構造函數(使用char *參數)來構造字符串對象。

在殼體2中的析構函數串類將被儘快consumeString返回調用,並且在第一種情況下的析構函數將在consumeString功能的te​​mperory變量被調用一次和兩次在passStringObject其他變量;

相關問題