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

时间:2011-08-12 03:41:32

标签: c++ static language-lawyer const-method

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

5 个答案:

答案 0 :(得分:116)

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

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

答案 1 :(得分:20)

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

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

截至今天,const被视为this的上下文。在某种程度上,它是狭窄的。通过在const指针之外应用此this,可以使其更广泛 即,“建议的”const,也可能适用于static函数,将限制static成员进行任何修改。

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

答案 2 :(得分:0)

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

回想一下const保持对象不变,但这里可能存在或不存在一个对象以保持不变。

答案 3 :(得分:0)

不幸的是,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

答案 4 :(得分:-1)

“ const成员函数”不是 允许修改其调用的对象,但为静态成员 函数不会在任何对象上调用。 范围解析运算符直接使用它。 因此,拥有const静态成员函数毫无意义,因此是非法的。