【问题标题】:Function parameters: const matching declaration and definition [duplicate]函数参数:const匹配声明和定义[重复]
【发布时间】:2016-08-15 06:31:08
【问题描述】:

偶然发现这个函数声明和定义可能在参数的常量上不一致。我找到了一些信息(链接如下),但我的问题是为什么 const 匹配对于按值参数是可选的,而对于引用参数则需要 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,但是他们没有详细说明为什么引用参数需要 const 匹配。

【问题讨论】:

  • 讨论不匹配here
  • 这不是重复的问题。我没有找到关于按值和按引用的 const 以及 why 存在差异的原因的问题。尽管this 的答案确实涵盖了按引用,但这并不明显,因为问题是按值的,它没有回答为什么存在差异。

标签: c++


【解决方案1】:

当您按值传递时,参数实际上是函数的局部变量。你通过的任何东西都会被复制。如果参数是const T,它只是意味着函数本身不能修改自己的变量。调用者不应该知道或关心这一点。

通过const T&实际上是指访问不属于函数的变量。与const T* 相同。但与T* const 不同,这只是意味着函数本身不能修改自己的指针。指针属于函数,如果函数想要重新分配它以指向其他属于它自己的事务的东西。它所指向的不属于函数,所以函数是否获得const的访问权与调用者非常相关。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果一个参数是按值传递但标记为 const,如果变量确实被修改了会发生什么?函数的本地副本会改变,但传入的副本不会。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-23
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2022-01-18
        • 1970-01-01
        • 2013-09-08
        相关资源
        最近更新 更多