c++,为啥要使用 const std::string & parameterName? [复制]

Posted

技术标签:

【中文标题】c++,为啥要使用 const std::string & parameterName? [复制]【英文标题】:c++, why use const std::string & parameterName? [duplicate]c++,为什么要使用 const std::string & parameterName? [复制] 【发布时间】:2016-02-26 00:46:23 【问题描述】:

在查看一些代码时,我遇到了一个带有以下参数的方法

methodName(const std::string & parameterName)

我知道 const 用于方法中不能更改的值,而 & 是引用的值。

为什么以及何时应该使用它而不仅仅是一个 const 字符串?

【问题讨论】:

注意:没有引用的风格 'void f(const T)` 只是一个实现细节(防止对复制的参数进行修改) 你读的哪本书没有涵盖这么基本的东西? 【参考方案1】:

const 保证函数不会更改参数。

& 是参考;这意味着传递给methodName 的字符串通过引用传递。这样做的好处是它不被复制,因此提高了性能

结合起来,这是一种有效传递大对象的常见模式。一个简单的const std::string 会复制整个字符串,对于长字符串,这将是非常低效的。


从C++11开始,你也可以通过moving他们高效地传递对象。

【讨论】:

【参考方案2】:

我知道const 用于表示无法更改的值

const 用于任何不能改变的东西——值、指针或引用。在不应该更改某些内容的情况下使用const 是个好主意,即使您按值传递它也是如此。

为什么以及何时应该使用它,而不仅仅是 const string

const string& 更经济,因为它可以让您避免复制字符串的内容。当您传递给函数的string 保证在函数执行期间保持不变时,您应该使用它。直接调用函数时总是如此。

相比之下,const string 应该在函数仍在运行时有可能删除字符串时使用。

例如,当您在不同的线程上调用函数,然后删除您传递给它的参数,或者让参数超出范围时,可能会发生这种情况。尝试通过const 引用传递参数会导致未定义的行为,而通过const 值传递它会生成私有副本,从而阻止UB。

【讨论】:

【参考方案3】:

尽管这里有所有答案,但有时实际上最好按值传递字符串,这专门用于提高性能。最常见的例子是字符串的operator+ 实现。

【讨论】:

【参考方案4】:

您需要使用const std::string 而不是const string,因为您正在使用您的程序无法全局访问的C++ String 类。

这是因为 C++ 字符串类是在命名空间 std 下定义的(命名空间是一组类),并且要使用 C++ 字符串类,您需要从该命名空间访问它。此外,您还需要使用范围解析运算符 (::)。

语法:

<namespace_name>::<class_name>

因此您需要使用std::string

【讨论】:

以上是关于c++,为啥要使用 const std::string & parameterName? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 复制构造函数必须使用 const 对象?

为啥要在 C++ 中按值传递对象 [重复]

为啥从 int 到 const char* 的转换会破坏 C++ [重复]

为啥 ostream::write() 在 C++ 中需要“const char_type*”而不是“const void*”?

在非常量对象上,为啥 C++ 不调用具有 public-const 和 private-nonconst 重载的方法的 const 版本?

为啥要设计一个库来在 Javascript 中使用 const [] 而不是 const ?