我已经看到了一个代码,该代码将第一个arg接受为const,另一个接受可修改。 在实现过程中为两个参数传递相同的变量是一种好习惯吗?
我无法理解以如此粗略的方式使用该方法的开发人员的动机。这是不常见的事吗?
void manipulate(const string& a, string& b)
{
if (a.length() > 0 )
b.append("_ok");
}
int main()
{
string a("Hello");
manipulate(a, a);
}
我想了解使用这种粗略的实现方式是否正确。
答案 0 :(得分:3)
const引用仅意味着:您不能通过引用修改对象。
这并不意味着:无法通过其他方式修改实例。
这是完全合法的:
void foo(const std::string& a, std::string& b) {
b = a + "foo";
}
int main() {
std::string x { "hello world"};
foo(a,a);
}
通常,编写方法时应没有隐藏的约束,例如,应该可以为两个不同的参数传递相同的参数(如上所述)。此外,这与const正确性相反。相反,上面的示例是const正确性的一个很好的示例,有助于避免错误。例如,您不能称其为
const std::string y{"hello const"};
foo(y,y); // error
答案 1 :(得分:1)
我想了解使用这种粗略的实现方式是否正确。
实现过程中没有粗暴或错误。
意图很明确:
b.append("_ok");
更改b
的值,因此需要将其作为非const
参考参数传递。
编写此类函数的更常见方式是
string& manipulate(string& a)
{
if (a.length() > 0 )
a.append("_ok");
return a;
}
尽管。
为什么函数的特定实现指定了const,而没有看到特定的用例就无法回答非const引用参数。
函数本身不知道引用指向相同的变量。
答案 2 :(得分:1)
如果仅应使用相同的参数调用方法void manipulate(const string& a, string& b)
,则将签名更改为void manipulate(string&)
很有用。
如果无效,那么
在使用相同的别名的实现中,当给定相同的参数时,我们应该小心操作。在这里b
被修改后,a
也是如此。