#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
。这对我来说很困惑。有人可以解释为什么会这样吗?我错过了什么?
答案 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
。
从技术上讲,在定义静态数据成员时,初始化程序可以被认为是在类的范围内,并且会在全局变量之前找到类成员。
这是一个相同的规则,确保当成员函数被定义为行外时,函数名称后面的名称将在类范围内查找,如果它们引用类成员则不需要显式限定。将此应用于静态数据成员的定义更为不寻常,但它完全一致。