如果我不打算修改字符串,那么第一个选项更好还是两者都相同-(我只想遍历字符串,但由于字符串大小很大,我不希望制作本地副本。)
int getString(string& str1) {
//code
}
int getString (string str1) {
//code
}
如果我确实打算改变字符串,那么两者之间有什么区别吗?是因为字符串在 C++ 中是不可变的吗?
如果我不打算修改字符串,那么第一个选项更好还是两者都相同-(我只想遍历字符串,但由于字符串大小很大,我不希望制作本地副本。)
int getString(string& str1) {
//code
}
int getString (string str1) {
//code
}
如果我确实打算改变字符串,那么两者之间有什么区别吗?是因为字符串在 C++ 中是不可变的吗?
为什么不通过 const 引用传递?这样既不会复制,也不会被调用的函数能够修改字符串。
int getString(string const &str1)
{
}
字符串文字是不可变的,std::string
s 不是。
第一个是通过引用传递。如果您不打算修改字符串,请通过const
引用传递它。
第二个是按值传递——如果你修改函数内部的字符串,你只会修改一个副本,所以它没有实际意义。
是的,会有区别。
第二个变体(没有&
)将按值将字符串复制到getString
函数的范围内。这意味着您所做的任何更新都将影响本地副本,而不是调用者的副本。这是通过使用旧值 ( std::string(std::string& val)
) 调用类的复制构造函数来完成的。
另一方面,第一个变体(带有&
)通过引用传递,因此更改局部变量将更改调用者的变量,除非引用被标记为 const(在这种情况下,您不能更改值)。这应该更快,因为如果您不更改字符串,则不需要进行复制操作。