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


86

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


1
会是什么一个const静态成员函数的意思是,你呢?
GManNickG 2011年

2
@GMan我的意思是,一个静态成员函数永远不会更改其任何输入。
prabhakaran 2011年

11
然后,您的输入(功能参数)应该是按值或const-references。
GManNickG 2011年

3
无论如何,它不会影响成员函数的参数的常数。这并不意味着“使所有内容变为常量”,而是意味着“使此为常量”。
UncleBens

@GMan您是说必须将const添加到参数中
prabhakaran 2011年

Answers:


137

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

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


这是否意味着“ const”仅适用于int,pointer等变量?
prabhakaran 2011年

@prabhakaran-成员函数也可以是const限定的。詹姆斯在回答中清楚地提到了这一点。
Mahesh

@Mahesh成员函数的const限定符也仅限定了'this指针',而不是整个。您仍然可以在const限定成员函数中更改全局变量。现在只有我检查了。
prabhakaran 2011年

5
-1 “静态成员函数没有this指针...因此,静态成员函数的const限定没有任何意义(那样)”本身是正确的,但由于对问题“为什么”有疑问,因此是错误的”。作为回答,它假定const静态成员和非静态成员的含义必须相同。举例来说,这种想法并不成立,请考虑的含义static,具体取决于上下文。
干杯和健康。-Alf 2014年

2
C const*还是const C*
crisron

24

我同意您的问题,但不幸的是C ++是按照这种方式设计的。例如:

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

截至今天,const在的上下文中考虑this。在某种程度上,它很窄。通过将其应用constthis指针之外,可以使其范围更广。
即“提议的” const(也可能适用于static功能)将限制static成员的任何修改。

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


8
可能与您无法const修改自由函数以表示“此函数不会修改任何全局变量”的原因相同。const适用于对象(在const成员函数的情况下,为其调用的实例)。您想使它适用于班级的所有静态成员,我想如果委员会完全考虑到它,则认为它不是支持的足够普遍的要求。
史蒂夫·杰索普

1
所述const改性剂不会施加到构件的方法或成员变量,而是隐含this终场。由于静态成员方法未绑定到对象,因此没有this指针可做const
Ruud Althuizen

1

无需详细说明,这是因为该函数可能会或可能不会有一个对象被修改,因此const对于编译器是不明确的。

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


2
“可以不可以”?静态成员函数永远不会this指针。(此外,const它不能使对象保持不变。它可以防止使用特定的指针或引用来修改对象,但修改可能仍会通过另一条路径进行)
Ben Voigt 2015年

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

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.