静态变量初始化测验
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。因此,其后的i
在C
的范围内查找,指向C::i
.
从技术上讲,当你定义一个静态数据成员时,初始化器可以被认为是在 class 的范围内,并且会在全局变量之前找到 class 个成员。
这与确保成员函数被外联定义时的规则相同,函数名称后的名称将在 class 范围内查找,并且不需要显式限定如果他们提到 class 成员。将此应用于静态数据成员的定义更为不寻常,但它是完全一致的。
#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。因此,其后的i
在C
的范围内查找,指向C::i
.
从技术上讲,当你定义一个静态数据成员时,初始化器可以被认为是在 class 的范围内,并且会在全局变量之前找到 class 个成员。
这与确保成员函数被外联定义时的规则相同,函数名称后的名称将在 class 范围内查找,并且不需要显式限定如果他们提到 class 成员。将此应用于静态数据成员的定义更为不寻常,但它是完全一致的。