7

如果我不打算修改字符串,那么第一个选项更好还是两者都相同-(我只想遍历字符串,但由于字符串大小很大,我不希望制作本地副本。)

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


int getString (string str1) {
    //code
}

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

4

3 回答 3

12

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

int getString(string const &str1)
{
}
于 2013-02-04T19:11:49.370 回答
12

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

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

第二个是按值传递——如果你修改函数内部的字符串,你只会修改一个副本,所以它没有实际意义。

于 2013-02-04T19:11:52.507 回答
2

是的,会有区别。

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

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

于 2013-02-04T19:12:30.787 回答