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



我有一个函数,看起来像这个

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

我的问题很简单,是按原样传递ver更好,还是将其作为指向字符串的指针传递更好?仅供参考,ver是一个小尺寸的字符串(大约为8)。编辑:如果ver发生更改,则无所谓。我只想用ver的内容替换version。第二版:我使用的是visualstudio2008。

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

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

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

对于这样的情况,我建议通过const std::string&:

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

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

但老实说,除非经常调用函数,否则可能没什么好担心的。

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

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

这样你就可以从右值和左值进行交换。实际上,你可以执行移动任务,而不是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

演示

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

请传递一个引用。

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

您希望将ver的内容存储到版本中。必须复印一份,问题是在哪里。

你可以按照你提议的方式来做,因为交换很快。但我注意到,并不是所有的控制路径都会给版本字符串分配一个新值。

因此,我建议采用以下

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

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

无论何时修改字符串并希望调用方看到更改,都应该通过引用将其传入。

最新更新