我应该按值传递字符串还是将指针传递给它?

时间:2014-10-14 14:18:17

标签: c++ string parameter-passing

我有一个看起来像这样的功能

int myclass::setVersion(std::string ver)
{
  if (ver.size()>1)
  {
    version.swap(ver)
    return 0;
  }
  else 
    return -1;
}

我的问题很简单,以ver的方式传递它作为指向字符串的指针是更好还是更好?仅供参考,ver是一个小尺寸的字符串(大约8)。 编辑:ver更改无关紧要。我只想将version替换为ver的内容。 EDIT2:我正在使用visual studio 2008.

5 个答案:

答案 0 :(得分:6)

这取决于您希望代码的行为。

这里建议的大多数答案会改变发布代码的行为,因为它们会修改传入的字符串(或者使代码无法编译,因为它无法修改传入的参数)。

在您发布的示例中,传递给myclass::setVersion()的字符串不会被修改(参数可能会被修改,但这只是传入的字符串的副本;一个副本将在函数时被销毁返回)。

对于这样的情况,我建议传递一个const std::string&

int myclass::setVersion(std::string const& ver)
{
  if (ver.size()>1)
  {
    version = ver;
    return 0;
  }
  else 
    return -1;
}

这样只在必要时才进行复制。

但老实说,除非经常调用该函数,否则可能无需担心。

答案 1 :(得分:5)

在C ++ 11中,您可以添加一个接受右值引用的重载:

int myclass::setVersion(std::string& ver);
int myclass::setVersion(std::string&& ver);

这样你就能从rvalues和lvalues交换。实际上,您可以执行移动分配而不是swap

version = std::move(ver);

这可能比swap更快,具体取决于std::string实施。

用法示例:

string getVersion() { return "version2"; }

string v1 = "version1";
a.setVersion(v1);           // lvalue
a.setVersion(getVersion()); // rvalue
a.setVersion("version3");   // rvalue as well

Demo

更新:实际上,您必须拥有setVersion的两种变体才能获得最大的灵活性。但我同意其他人的观点,认为所有这些都是过早的优化,只有在此时分析显示出瓶颈时才应该使用。

答案 2 :(得分:3)

请传递参考资料。

int myclass::setVersion(std::string& ver)

答案 3 :(得分:2)

每当修改字符串并希望调用者看到该更改时,您应该通过引用传入它。

答案 4 :(得分:2)

您希望将ver的内容存储到版本中。必须制作副本,问题在哪里。

您可以按照提议的方式进行,因为交换速度很快。但我注意到并非所有控制路径都会为版本字符串分配新值。

因此我建议如下

int myclass::setVersion(const std::string& ver)
{
  if (ver.size()>1)
  {
    version = ver;
    return 0;
  }
  else 
    return -1;
}

如果ver的大小为1,这将避免副本,在这种情况下,您不希望将字符串复制到版本中。