#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
, Что меня смущает. Может кто-нибудь объяснить, почему это происходит? Что мне не хватает?
В декларации, в которой описатель-идентификатор это Квалифицированный-идентификатор, имена, используемые до Квалифицированный-идентификатор быть объявленным
ищутся в определяющей области пространства имен; имена, следующие за Квалифицированный-идентификатор смотрят в сферу
класса члена или пространства имен.
В
int C::j = i + 1;
описатель-идентификатор, т.е. название объекта, который объявляется, C::j
, который является Квалифицированный-идентификатор. Следовательно i
после этого ищется в объеме C
и относится к C::i
,
Менее технически, когда вы определяете статический член данных, инициализатор может рассматриваться как находящийся в области видимости класса, и он будет находить членов класса перед глобальными.
Это то же правило, которое гарантирует, что когда функция-член определяется вне строки, имена после имени функции будут просматриваться в области видимости класса и не потребуют явной квалификации, если они ссылаются на членов класса. Более необычно видеть, что это применяется к определениям статических элементов данных, но это совершенно непротиворечиво.