为什么静态成员函数不能有 const 限定符?

问题描述 投票:0回答:5

今天我遇到了一个问题。我需要一个

static
成员函数,
const
不是必须的,而是更好的。但是,我的努力并没有成功。谁能说出原因或方法吗?

c++ static language-lawyer function-qualifier const-method
5个回答
171
投票

当您将

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

静态成员函数没有

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


30
投票

我同意你的问题,但不幸的是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
不能被修改。如果将此规则添加到标准中,我看不到任何语言副作用。相反,有趣的是为什么这样的规则不存在!


1
投票

不幸的是,C++ 不按照设计接受它,但从逻辑上讲,它验证良好的用例很少。

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

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

0
投票

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

回想一下,

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.