静态变量初始化测验

mar*_*rsh 16 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;
}
Run Code Online (Sandbox Code Playgroud)

价值是什么:C :: j

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

int C::j = i + 1;

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

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

Bri*_*ian 24

[basic.lookup.qual]/3

在声明中,该声明符-ID是一个合格的-ID,在之前使用的名称合格-ID被宣布在定义命名空间范围中查找; 在成员的类或命名空间的范围内查找qualified-id后面的名称.

int C::j = i + 1;
Run Code Online (Sandbox Code Playgroud)

声明符-ID, 所声明的实体的名称,是C::j,这是一个合格的-ID.因此,i以下是在查阅范围内C,并参考C::i.

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

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

  • 应该添加为什么`C :: j`必然在`C :: i`之后被初始化,所以它肯定是21而不是1. (2认同)