字符串作为参数?

时间:2013-02-04 19:10:10

标签: c++ string parameters reference

如果我不打算修改字符串那么第一个选项更好或者两者都相同 - (我只想迭代字符串,但因为字符串大小很大我不知道想要制作本地副本。)

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


int getString (string str1) {
    //code
}

如果我打算改变字符串,那两者之间有什么区别吗?是因为字符串在C ++中是不可变的吗?

3 个答案:

答案 0 :(得分:11)

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

第一个是传递参考。如果您不打算修改字符串,请通过const引用传递它。

第二个是pass-by-value - 如果你修改了函数内部的字符串,你只需要修改一个副本,所以这没有实际意义。

答案 1 :(得分:9)

为什么不通过const引用?这样既不会复制,也不会被调用的函数能够修改字符串。

int getString(string const &str1)
{
}

答案 2 :(得分:2)

是的,会有所不同。

第二个变体(没有&)将将字符串复制getString函数的范围内。这意味着您所做的任何更新都将影响本地副本,而不会影响调用方的副本。这是通过使用旧值(std::string(std::string& val))调用类的复制构造函数来完成的。

另一方面,第一个变体(&)通过引用传递,因此更改局部变量将更改调用者的变量,除非引用被标记为const(在这种情况下,您无法更改价值)。这个应该更快,因为如果你不更改字符串,就不需要进行复制操作。