Викторина инициализации статических переменных

#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, Что меня смущает. Может кто-нибудь объяснить, почему это происходит? Что мне не хватает?

16

Решение

[Basic.lookup.qual] / 3

В декларации, в которой описатель-идентификатор это Квалифицированный-идентификатор, имена, используемые до Квалифицированный-идентификатор быть объявленным
ищутся в определяющей области пространства имен; имена, следующие за Квалифицированный-идентификатор смотрят в сферу
класса члена или пространства имен.

В

int C::j = i + 1;

описатель-идентификатор, т.е. название объекта, который объявляется, C::j, который является Квалифицированный-идентификатор. Следовательно i после этого ищется в объеме Cи относится к C::i,

Менее технически, когда вы определяете статический член данных, инициализатор может рассматриваться как находящийся в области видимости класса, и он будет находить членов класса перед глобальными.

Это то же правило, которое гарантирует, что когда функция-член определяется вне строки, имена после имени функции будут просматриваться в области видимости класса и не потребуют явной квалификации, если они ссылаются на членов класса. Более необычно видеть, что это применяется к определениям статических элементов данных, но это совершенно непротиворечиво.

24

Другие решения


По вопросам рекламы [email protected]