如果我不打算修改一個字符串,然後是第一個選項更好或者都是相同的 -(我只是想遍歷字符串,但由於字符串大小很大,我不希望進行本地複製。)字符串作爲參數?
int getString(string& str1) {
//code
}
int getString (string str1) {
//code
}
如果我不上改變字符串計劃,則是兩者之間有什麼區別?是否因爲字符串在C++中是不可變的?
如果我不打算修改一個字符串,然後是第一個選項更好或者都是相同的 -(我只是想遍歷字符串,但由於字符串大小很大,我不希望進行本地複製。)字符串作爲參數?
int getString(string& str1) {
//code
}
int getString (string str1) {
//code
}
如果我不上改變字符串計劃,則是兩者之間有什麼區別?是否因爲字符串在C++中是不可變的?
字符串文字是不可變的,std::string
s不是。
第一個是通過引用。如果您不打算修改字符串,請通過const
參考。
第二個是按值傳遞 - 如果你修改了函數內部的字符串,你只會修改一個副本,所以它是沒有意義的。
所以如果我通過引用傳遞並更改字符串,原始字符串將被更改?不是一個副本,不像java? – ofey
@ofey - 是的,但上次我使用Java我非常肯定類類型(即非基本類型)也通過引用傳遞,而不是值。它可能是Java中'string'和'String'的區別。 – slugonamission
@slugonamission 所以如果我想改變一個巨大的字符串,我不在乎保存它的原始價值,我應該通過引用傳遞它,並且不會做任何本地副本? – ofey
爲什麼你不通過const引用?這樣既不會複製副本,被調用的函數也不能修改字符串。
int getString(string const &str1)
{
}
是的,會有區別。
第二個變體(不含&
)將拷貝將該字符串按值轉換爲getString
函數的作用域。這意味着您所做的任何更新都會影響本地副本,而不會影響主叫方的副本。這是通過用舊值調用類的拷貝構造函數完成的(std::string(std::string& val)
)。
另一方面,第一個變體(與&
)通過引用傳遞,所以更改局部變量將更改調用者的變量,除非引用標記爲const(在這種情況下,您不能更改該值) 。這應該要快,因爲如果您不更改字符串,則不需要執行任何複製操作。
字符串在C++中不是不可變的。如果你不需要修改它,只需傳遞const引用即可。 – chris