gpt4 book ai didi

c++ - 静态变量初始化测验

转载 作者:IT老高 更新时间:2023-10-28 22:19:16 31 4
gpt4 key购买 nike

#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

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

这条规则确保当成员函数被离线定义时,函数名称之后的名称将在类范围内查找,并且如果它们引用类成员则不需要显式限定.将这应用于静态数据成员的定义是很不寻常的,但它是完全一致的。

关于c++ - 静态变量初始化测验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362904/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com