为什么一个方法对同一个变量有const和non const参数?

时间:2019-08-20 07:24:43

标签: c++ function methods const

我已经看到了一个代码,该代码将第一个arg接受为const,另一个接受可修改。 在实现过程中为两个参数传递相同的变量是一种好习惯吗?

我无法理解以如此粗略的方式使用该方法的开发人员的动机。这是不常见的事吗?

void manipulate(const string& a, string& b)
{
  if (a.length() > 0 )
    b.append("_ok");
}

int main()
{
  string a("Hello");
  manipulate(a, a);

}

我想了解使用这种粗略的实现方式是否正确。

3 个答案:

答案 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也是如此。