Должно быть распечатано 3. Основное правило состоит в том, чтобы в основном работать в обратном направлении по файлу до самого последнего определения, которое видел бы компилятор (правка: это не вышло из области видимости), и это то, что он использует , Для переменных, которые являются локальными для класса, вы следуете тому же , за исключением , что все переменные класса обрабатываются так, как если бы они были определены в начале определения класса. Обратите внимание, что это более или менее уникально для классов. Например, данный код выглядит так:
int i;
int x() {
std::cout << i << '\n'; // prints 0;
int i=1;
}
Несмотря на то, что равно и i
, локально для функции, самое последнее определение, где используется cout
, является глобальным, так что это то, к чему относится i
в этом выражении , Если, однако, это было в классе:
int i;
class X {
void y() { std::cout << i << "\n"; }
X() : i(2) {}
int i;
};
Тогда выражение cout
будет ссылаться на X::i
, хотя его определение еще не было замечено при разборе y
.