Совет. Определяйте переменные при первом использовании

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

Вложенные области видимости

Области видимости могут содержать другие области видимости. Содержащаяся (или вложенная) область видимости называется внутренней областью видимости (inner scope), а содержащая ее области видимости — внешней областью видимости (outer scope).

Как только имя объявлено в области видимости, оно становится доступно во вложенных в нее областях видимости. Имена, объявленные во внешней области видимости, могут быть также переопределены во внутренней области видимости:

#include

// Программа предназначена исключительно для демонстрации.

// Использование в функции глобальной переменной, а также определение

// одноименной локальной переменной - это очень плохой стиль

// программирования

int reused = 42; // reused имеет глобальную область видимости

int main()

{

 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;

<p><image l:href="#reader.png"/>2.3. Составные типы</p>

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

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

<p><image l:href="#reader.png"/>2.3.1. Ссылки</p>

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

Перейти на страницу:

Похожие книги