>{
> int unique = 0; // unique имеет область видимости блока
> // вывод #1; используется глобальная reused; выводит 42 0
> std::cout << reused << " " << unique << std::endl;
> int reused = 0; // новый локальный объект по имени reused скрывает
> // глобальный reused
> // вывод #2: используется локальная reused; выводит 0 0
> std::cout << reused << " " << unique << std::endl;
> // вывод #3: явное обращение к глобальной reused; выводит 42 0
> std::cout << ::reused << " " << unique << std::endl;
> return 0;
>}
Вывод #1 осуществляется перед определением локальной переменной >reused
. Поэтому данный оператор вывода использует имя >reused
, определенное в глобальной области видимости. Этот оператор выводит >42 0
. Вывод #2 происходит после определения локальной переменной >reused
. Теперь локальная переменная >reused
находится в области видимости (in scope). Таким образом, второй оператор вывода использует локальный объект >reused
, а не глобальный и выводит >0 0
. Вывод #3 использует оператор области видимости (см. раздел 1.2) для переопределения стандартных правил областей видимости. У глобальной области видимости нет имени. Следовательно, когда у оператора области видимости пусто слева, это обращение к указанному справа имени в глобальной области видимости. Таким образом, это выражение использует глобальный объект >reused
и выводит 42 0.
Упражнение 2.13. Каково значение переменной >j
в следующей программе?
>int i = 42;
>int main() {
> int i = 100;
> int j = i;
>}
Упражнение 2.14. Допустим ли следующий код? Если да, то какие значения он отобразит на экране?
>int i = 100, sum = 0;
>for (int i = 0; i != 10; ++i)
> sum += i;
>std::cout << i << " " << sum << std::endl;
Составной тип (compound type) — это тип, определенный в терминах другого типа. У языка С++ есть несколько составных типов, два из которых, ссылки и указатели, мы рассмотрим в этой главе.
У рассмотренных на настоящий момент объявлений не было ничего, кроме имен переменных. Такие переменные имели простейший, базовый тип объявления. Более сложные операторы объявления позволяют определять переменные с составными типами, которые состоят из объявлений базового типа.
Ссылка (reference) является альтернативным именем объекта. Ссылочный тип "ссылается на" другой тип. В определении ссылочного типа используется оператор объявления в форме >&d
, где >d
— объявляемое имя:
>int ival = 1024;
>int &refVal = ival; // refVal ссылается на другое имя, ival
>int &refVal2; // ошибка: ссылку следует инициализировать
Обычно при инициализации переменной значение инициализатора копируется в создаваемый объект. При определении ссылки вместо копирования значения инициализатора происходит связывание (bind) ссылки с ее инициализатором. После инициализации ссылка остается связанной с исходным объектом. Нет никакого способа изменить привязку ссылки так, чтобы она ссылалась на другой объект, поэтому ссылки