98

今天我遇到了一个问题。我需要一个static成员函数,const不是必须的而是更好的。但是,我的努力没有成功。谁能说出为什么或如何?

4

5 回答 5

158

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

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

于 2011-08-12T03:46:17.040 回答
27

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

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

截至今天,constthis. 在某种程度上,它是狭窄的。通过在指针const之外应用 this 可以使其更广泛。 即“提议” ,也可能适用于功能,将限制成员进行任何修改。 this
conststaticstatic

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

于 2011-08-12T05:08:26.420 回答
1

不幸的是,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
于 2016-06-11T18:32:48.500 回答
0

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

回想一下,const保持对象不变,但这里可能有也可能没有一个对象来保持不变。

于 2015-04-05T19:44:53.447 回答
0

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

于 2019-05-28T06:51:25.477 回答