静态变量初始化测验

时间:2015-09-02 20:53:17

标签: c++ static-members scoping

#include <stdio.h>

class C
{
   public:
          static int i;
          static int j;
};

int i = 10;
int C::i = 20;
int C::j = i + 1;

int main ()
{
    printf("%d", C::j);

    return 0;
}
  

值是什么:C :: j

我正在阅读c ++测验,并遇到了以下问题。我认为答案是11

int C::j = i + 1;

因为它正在访问10的非静态i?所以,我认为11应该是答案?

我通过visual studio编译并运行了这段代码,并打印出21。这对我来说很困惑。有人可以解释为什么会这样吗?我错过了什么?

1 个答案:

答案 0 :(得分:24)

[basic.lookup.qual] / 3

  

declarator-id 是声明 qualified-id 之前使用的 qualified-id,名称的声明中   在定义的命名空间范围中查找;在范围内查找 qualified-id 后面的名称   成员的类或命名空间。

int C::j = i + 1;

declarator-id, 正在声明的实体的名称是C::j,这是 qualified-id 。因此,在i的范围内查找跟随它的C,并引用C::i

从技术上讲,在定义静态数据成员时,初始化程序可以被认为是在类的范围内,并且会在全局变量之前找到类成员。

这是一个相同的规则,确保当成员函数被定义为行外时,函数名称后面的名称将在类范围内查找,如果它们引用类成员则不需要显式限定。将此应用于静态数据成员的定义更为不寻常,但它完全一致。