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;
}
价值是什么: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;
该声明符-ID, 即所声明的实体的名称,是C::j,这是一个合格的-ID.因此,i以下是在查阅范围内C,并参考C::i.
从技术上讲,在定义静态数据成员时,初始化程序可以被认为是在类的范围内,并且会在全局变量之前找到类成员.
这是一个相同的规则,确保当成员函数被定义为行外时,函数名称后面的名称将在类范围内查找,如果它们引用类成员则不需要显式限定.将此应用于静态数据成员的定义更为不寻常,但它完全一致.