Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
37
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

92 Глава 2

Если вы скомпилируете и запустите этот пример, то получите следующий вывод:

Описание полученных результатов

Выделенные полужирным строки кода указывают изменения, которые я внес в предыдущий пример. Поговорим только о них. Объявление переменной countl, предшествующее определению функции main () — глобальное, поэтому в принципе она доступна на всем протяжении функции main (). Эта глобальная переменная ини- циализируется значением 100:

Однако у вас есть две других переменных countl, определенные внутри main (), поэтому по всей программе глобальная переменная countl скрыта локальными countl. Первый новый оператор вывода:

Здесь используется операция разрешения контекста (: :), поясняющая компиля- тору, что вы хотите обратиться к глобальной переменной countl, а не к локальной. Посмотрев на вывод программы, можно убедиться, что это работает.

Во вложенном блоке глобальная переменная countl скрыта за двумя переменны- ми по имени countl: внутренней и внешней. Мы можем видеть, что глобальная опе- рация разрешения контекста выполняет свою работу и во внутреннем блоке, как до- казывает вывод, генерируемый еще одним добавленным оператором:

Оно отображает значение 100, как и ранее — "длинная рука" операции разрешения контекста, использованной в такой манере, всегда достанет глобальную переменную.

Ранее вы уже видели, что можно сослаться на имя в пространстве имен std, дополнив его именем этого пространства имен— как, например, в случае std: :cout и std: :endl. Компилятор ищет указанное имя в пространстве имен, имя которого совпадает с левым операндом операции разрешения контекста. В предыдущем примере вы использовали опера- цию разрешения контекста для поиска в глобальном пространстве переменной countl. Тем, что перед оператором не было указано имя пространства имен, вы сообщили компилятору, что для поиска имени он должен обратиться к глобальному пространству имен.

Данные, переменные и вычисления 93

Вы узнаете еще больше об этой операции, когда в главе 9 пойдет речь об объектно- ориентированном программировании, где она применяется очень широко.

Статические переменные

Вероятно, рано или поздно вам понадобится иметь переменную, которая опреде- лена и доступна локально, но продолжает существовать после выхода из блока, в ко- тором она объявлена. Другими словами, необходимо иметь возможность объявить переменную, имеющую область видимости в пределах блока, но обеспечить ей ста- тическое время хранения. Спецификатор static обеспечивает такую возможность, а потребность в ней станет более очевидной, когда мы будем говорить о функциях в главе 5.

На самом деле статическая переменная существует на протяжении всего времени жизни программы, даже если она объявлена внутри блока и доступна только в нем (или в его подблоках). Она также имеет область видимости блока, но при этом имеет и статическое время хранения. Чтобы объявить статическую целочисленную пере- менную count, вы должны написать так:

Если вы не предоставляете статической переменной начальное значение при ее объявлении, она будет инициализирована значением по умолчанию, а именно — ну- лем. Значение инициализации по умолчанию для статических переменных всегда рав- но 0, преобразованному к типу данной переменной. Напомним, что автоматических переменных это правило не касается.

Если вы не инициализируете свои автоматические переменные, они будут содержать мусор—значе- ния, которые остались в выделенной для них памяти от предыдущих запусков других программ.

Пространства имен

Я уже несколько раз упоминал о пространствах имен, так что теперь наступило время дать более точное представление об этом понятии. Пространства имен не при- меняются в библиотеках, поддерживающих MFC, но библиотеки, поддерживающие CLR и Windows Forms, используют их интенсивно, и стандартная библиотека ANSI С++, конечно, тоже.

Вы уже знаете, что все имена, используемые в стандартной библиотеке ISO/ANSI С++, определены в пространстве имен std. Это значит, что все имена, встречающие- ся в стандартной библиотеке, имеют дополнительное квалифицирующее имя — std, поэтому cout, например — это на самом деле std: : cout. Вы можете видеть примене- ние полных квалифицированных имен в следующем тривиальном примере.