此函数和成员函数的恒定正确性

const-correctness for this and member functions

本文关键字:函数 正确性 成员      更新时间:2023-10-16

假设我有一个通用类 A

class A {
  ...
  int a;                // a member
  void foo() const{...} // a member function qualified as const
  ...
};

这意味着,如果我声明一个像 A k; 这样的A实例,然后我调用k.foo();作用于/内部的 this 指针,该调用foo是类型 const A * const 的东西。

现在我想知道为什么这篇博文中的代码有效,特别是为什么这不适用于全局变量。

我的解释是关于指针别名的隐藏操作,例如隐式复制this指针,在此复制过程中,结果不再const(出于某种原因......),但它仍然是一个this指针,这意味着它是指向同一实例的指针。

我的问题是:如果在声明成员函数的接口之后应用它,const真正做什么?您对链接的博客文章有具体的答案吗?


来自博客的代码

#include <iostream>
class counter {
public:
  int i;    
  counter();    
  int inspect() const;
  void increment();
};
counter sigma_inspect; // sigma_inspect is global
counter::counter() { i = 0; }
int counter::inspect() const {
  sigma_inspect.increment();
  return i;
}
void counter::increment() {
  ++i;
  return;
}
int main(void) {
  counter a; 
  std::cout << a.inspect() << "n"; 
  std::cout << sigma_inspect.inspect() << "n";
  std::cout << sigma_inspect.inspect() << "n";
  return 0;
}

博客文章中的调用正在使用非常量sigma_inspect,并且它正在其上调用非常量方法,而不是通过常量this指针调用所述方法。那又怎样?作者似乎期待魔法,而不是他所写的显而易见的东西。就像拥有

T* t = ...;
const T* ct = t;
t->foo(); // foo() is not const, but hey,
          // I also have a const pointer now (ct),
          // so why can I still use this???

一般来说,如果有人说C++愚蠢,它会告诉你更多关于作者的信息,而不是语言:)