我有一个看起来像这样的功能
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.
答案 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
更新:实际上,您必须拥有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,这将避免副本,在这种情况下,您不希望将字符串复制到版本中。