函数参数:const匹配声明和定义

时间:2016-04-21 20:41:43

标签: c++

偶然发现这一点,函数声明和定义可能不同意参数的常量。我找到了一些信息(链接如下),但我的问题是为什么const匹配可选的by-value参数,但参考参数需要const匹配?

请考虑以下可用代码here

class MyClass
{
  int X;
  int Y;
  int Z;

public:
  void DoSomething(int z, int y, const int& x);
  int  SomethingElse(const int x);
  void Another(int& x);
  void YetAnother(const int& z);
};

void MyClass::DoSomething(int z, const int y, const int& x) // const added on 2nd param
{
  Z = z;
  Y = y;
  X = x;
}

int MyClass::SomethingElse(int x) // const removed from param
{
  X = x;
  x = 3;
  return x;
}

void MyClass::Another(int& x) // const not allowed on param
{
  X = x;
}

void MyClass::YetAnother(const int& z) // const required on param
{
  Z = z;
}

我找到了this on SO,但它正在寻找名称修改的解释。我还找到了this on SOthis on SO,但他们没有详细说明参考参数需要进行常规匹配的原因。

3 个答案:

答案 0 :(得分:2)

当您通过值传递时,该参数实际上是函数的局部变量。无论你传递什么都被复制了。如果参数是const T,那只意味着函数本身不能修改自己的变量。来电者不应该知道或关心这一点。

传递const T&实际上是指访问不属于该函数的变量。与const T*相同。但与T* const不一样,那就是函数本身不能修改自己的指针。指针属于该函数,如果该函数想要重新指定它以指向其他自己的业务。它指向的内容不属于该函数,因此函数是否获得const访问权限与调用者非常相关。

答案 1 :(得分:1)

对于值参数,const实际上没有任何区别。如果参数作为值传递,则无论如何都不能修改它。

答案 2 :(得分:1)

如果参数按值传递但标记为const,那么如果变量被修改会发生什么?函数的本地副本将会更改,但传入的副本不会更改。

然而,另一方面,如果通过引用传递,如果你可以以某种方式修改变量,它将操纵原始而不仅仅是副本。