'const' 方法可以改变什么?

新手上路,请多包涵

C++ 方法允许使用 const 限定符来指示该方法不更改对象。但是,这是什么意思?例如。如果实例变量是指针,这是否意味着指针没有改变,或者它们指向的内存没有改变?

具体来说,这是一个最小的示例类

class myclass {
  int * data;

  myclass() {
    data = new int[10];
  }

  ~myclass() {
    delete [] data;
  }

  void set(const int index) const {
    data[index] = 1;
  }
};

方法 set 是否正确符合 const 的条件?它不会改变成员变量 data ,但它确实会改变数组的内容。

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 807
2 个回答

最简洁,这意味着 this 的类型是 const T * 在 const 成员函数中,其中 T * T 是你的类,而在非限定函数中它是 ---

您的方法 set 不会改变 data ,因此可以将其限定为 const。换句话说, myclass::data 被访问为 this->data 并且是 int * const 类型。

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

‘const’ 方法可以改变什么?

在不明确抛弃 constness 的情况下,一个 const 方法可以改变:

  • mutable 数据成员,和
  • 该类具有非 const 访问的任何数据,无论该数据是否可访问:
    • 通过作为指针或引用的成员变量,
    • 通过作为函数参数传递的指针或引用,
    • 通过函数返回的指针或引用,
    • 直接在包含它的命名空间或类(用于静态)中。

对于 class / struct / union 类型的成员,它依赖于其成员函数的常量来确定应该允许哪些操作。 (它还可以更改任何非常量局部变量和按值参数,但我知道这不是您感兴趣的)。

它可以调用其他具有相同能力和限制的 const 方法。

例如。如果实例变量是指针,这是否意味着指针没有改变,或者它们指向的内存没有改变?

这意味着指针不能(容易/意外地)更改。这 并不 意味着指向的内存不能更改。

您偶然发现的是 const 函数在概念上更改对象拥有的指向或引用数据的逻辑错误。正如您所发现的,编译器不会强制执行您可能想要或期望的 const 正确性。这有点危险,但意味着 _不需要为指向其他对象的指针/引用显式删除常量,这些对象可能会作为 const 函数的副作用而更改_。例如,日志记录对象。 (通常,此类对象在逻辑上不属于 const 函数对其进行操作的对象。)关键是编译器无法可靠地区分对象所拥有的逻辑所有权类型指向数据,所以它必须以一种或另一种方式猜测,并允许程序员覆盖或不受 const 的保护。 C++ 放弃了保护。

有趣的是,我听说 Walter Bright 的 D 语言会翻转这个默认值,在 const 函数中默认设置指向数据 const 。这对我来说似乎更安全,尽管很难想象最终需要明确抛弃 constness 以允许想要的副作用的频率,以及这是否会让人感到令人满意的精确或令人讨厌的冗长。

原文由 Tony Delroy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题