如果我不打算修改字符串那么第一个选项更好或者两者都相同 - (我只想迭代字符串,但因为字符串大小很大我不知道想要制作本地副本。)
int getString(string& str1) {
//code
}
int getString (string str1) {
//code
}
如果我打算改变字符串,那两者之间有什么区别吗?是因为字符串在C ++中是不可变的吗?
答案 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(在这种情况下,您无法更改价值)。这个应该更快,因为如果你不更改字符串,就不需要进行复制操作。