今天我遇到了一个问题。我需要一个
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
的背景下。从某种程度上来说,它是狭窄的。通过将这个 const
应用到 this
指针之外,可以使其变得更宽。const
,也可能适用于static
功能,将限制static
成员进行任何修改。
在示例代码中,如果
foo()
可以变为const
,那么在该函数中,A::s
不能被修改。如果将此规则添加到标准中,我看不到任何语言副作用。相反,有趣的是为什么这样的规则不存在!
不幸的是,C++ 不按照设计接受它,但从逻辑上讲,它验证良好的用例很少。
类级别有效(静态)的函数可能不会更改任何静态数据,可能只是查询数据应该是常量。 也许应该像
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 static 成员函数是没有意义的,因此它是非法的。