Объект имеет смысл определять поближе к месту его первого использования. Это улучшает удобочитаемость и облегчает поиск определения переменной. Однако важней всего то, что когда переменная определяется ближе к месту ее первого использования, зачастую проще присвоить ей подходящее исходное значение.
Области видимости могут содержать другие области видимости. Содержащаяся (или вложенная) область видимости называется
Как только имя объявлено в области видимости, оно становится доступно во вложенных в нее областях видимости. Имена, объявленные во внешней области видимости, могут быть также переопределены во внутренней области видимости:
#include
//
//
//
//
int reused = 42; //
int main()
{
int unique = 0; //
//
std::cout << reused << " " << unique << std::endl;
int reused = 0; //
// глобальный reused
//
std::cout << reused << " " << unique << std::endl;
//
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;
У рассмотренных на настоящий момент объявлений не было ничего, кроме имен переменных. Такие переменные имели простейший, базовый тип объявления. Более сложные операторы объявления позволяют определять переменные с составными типами, которые состоят из объявлений базового типа.
Ссылка (reference) является альтернативным именем объекта. Ссылочный тип "ссылается на" другой тип. В определении ссылочного типа используется оператор объявления в форме &d
, где d
— объявляемое имя: