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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 int 到 const char* 的转换会破坏 C++ [重复]
为啥 ostream::write() 在 C++ 中需要“const char_type*”而不是“const void*”?
在非常量对象上,为啥 C++ 不调用具有 public-const 和 private-nonconst 重载的方法的 const 版本?