×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 42 из 714 Настройки

>{

> 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.2.4

Упражнение 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;

2.3. Составные типы

Составной тип (compound type) — это тип, определенный в терминах другого типа. У языка С++ есть несколько составных типов, два из которых, ссылки и указатели, мы рассмотрим в этой главе.

У рассмотренных на настоящий момент объявлений не было ничего, кроме имен переменных. Такие переменные имели простейший, базовый тип объявления. Более сложные операторы объявления позволяют определять переменные с составными типами, которые состоят из объявлений базового типа.

2.3.1. Ссылки

Ссылка (reference) является альтернативным именем объекта. Ссылочный тип "ссылается на" другой тип. В определении ссылочного типа используется оператор объявления в форме >&d, где >d — объявляемое имя:

>int ival = 1024;

>int &refVal = ival; // refVal ссылается на другое имя, ival

>int &refVal2;       // ошибка: ссылку следует инициализировать

Обычно при инициализации переменной значение инициализатора копируется в создаваемый объект. При определении ссылки вместо копирования значения инициализатора происходит связывание (bind) ссылки с ее инициализатором. После инициализации ссылка остается связанной с исходным объектом. Нет никакого способа изменить привязку ссылки так, чтобы она ссылалась на другой объект, поэтому ссылки