静态变量初始化测验

Static Variables Initialization Quiz

#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;
}

What is the value of: C::j

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

int C::j = i + 1;

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

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

[basic.lookup.qual]/3

In a declaration in which the declarator-id is a qualified-id, names used before the qualified-id being declared are looked up in the defining namespace scope; names following the qualified-id are looked up in the scope of the member’s class or namespace.

int C::j = i + 1;

declarator-id, 被声明实体的名称,是C::j,这是一个合格的 id。因此,其后的iC的范围内查找,指向C::i.

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

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