2013-02-04 134 views
5

如果我不打算修改一個字符串,然後是第一個選項更好或者都是相同的 -(我只是想遍歷字符串,但由於字符串大小很大,我不希望進行本地複製。)字符串作爲參數?

int getString(string& str1) { 
    //code 
} 


int getString (string str1) { 
    //code 
} 

如果我不上改變字符串計劃,則是兩者之間有什麼區別?是否因爲字符串在C++中是不可變的?

+2

字符串在C++中不是不可變的。如果你不需要修改它,只需傳遞const引用即可。 – chris

回答

7

字符串文字是不可變的,std::string s不是。

第一個是通過引用。如果您不打算修改字符串,請通過const參考。

第二個是按值傳遞 - 如果你修改了函數內部的字符串,你只會修改一個副本,所以它是沒有意義的。

+0

所以如果我通過引用傳遞並更改字符串,原始字符串將被更改?不是一個副本,不像java? – ofey

+0

@ofey - 是的,但上次我使用Java我非常肯定類類型(即非基本類型)也通過引用傳遞,而不是值。它可能是Java中'string'和'String'的區別。 – slugonamission

+0

@slugonamission 所以如果我想改變一個巨大的字符串,我不在乎保存它的原始價值,我應該通過引用傳遞它,並且不會做任何本地副本? – ofey

9

爲什麼你不通過const引用?這樣既不會複製副本,被調用的函數也不能修改字符串。

int getString(string const &str1) 
{ 
} 
2

是的,會有區別。

第二個變體(不含&)將拷貝將該字符串按值轉換爲getString函數的作用域。這意味着您所做的任何更新都會影響本地副本,而不會影響主叫方的副本。這是通過用舊值調用類的拷貝構造函數完成的(std::string(std::string& val))。

另一方面,第一個變體(與&)通過引用傳遞,所以更改局部變量將更改調用者的變量,除非引用標記爲const(在這種情況下,您不能更改該值) 。這應該要快,因爲如果您不更改字符串,則不需要執行任何複製操作。