今天我遇到了问题。我需要一个static
成员函数,const
不是必须的,而是更好的。但是,我没有成功。任何人都可以说为什么或如何?
答案 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静态成员函数毫无意义,因此是非法的。