C++ - 为什么不能用"const"限定符创建静态成员函数



今天我遇到了一个问题。我需要一个static成员功能,const不是必须的,而是更好的。但是,我的努力没有成功。有人知道为什么吗?

当您将const限定符应用于非静态成员函数时,它会影响this指针。对于C类的const限定的成员函数,this指针的类型是C const*,而对于非const限定的成员函数,this指针的类型是C*

静态成员函数没有this指针(这样的函数不会在类的特定实例上调用),因此静态成员函数的const限定没有任何意义。

我同意你的问题,但不幸的是c++就是这样设计的。例如:

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

今天,const是在this的上下文中考虑的。在某种程度上,它是狭窄的。它可以通过在this指针之外应用const而变得更宽。
也就是说,"提议的"const,也可能适用于static功能,将限制static成员的任何修改。

在示例代码中,如果foo()可以变成const,那么在该函数中,A::s不能被修改。如果将此规则添加到标准中,我看不到任何语言副作用。相反,为什么这样的规则不存在,这很有趣!

不幸的是,c++不接受它作为设计,但从逻辑上讲,很少有用例可以很好地验证它。

类级有效(静态)的函数可能不会改变任何静态数据,可能只是查询应该是const的数据。也许它应该像

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios

不深入细节,这是因为可能有也可能没有被函数修改的对象,所以const对编译器来说是不明确的。

还记得const保持对象不变,但这里可能有也可能没有对象保持不变。

一个'const成员函数'不是允许修改调用它的对象,但是静态成员函数不能在任何对象上调用。它直接由作用域解析操作符使用。因此,拥有const静态成员函数是没有意义的,因此它是非法的。

最新更新