![](/user_photo/2706_HbeT2.jpg)
- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
Если
вы скомпилируете и запустите этот
пример, то получите следующий вывод:
92 Глава 2
Выделенные полужирным строки кода указывают изменения, которые я внес в предыдущий пример. Поговорим только о них. Объявление переменной countl, предшествующее определению функции main () — глобальное, поэтому в принципе она доступна на всем протяжении функции main (). Эта глобальная переменная ини- циализируется значением 100:
Однако у вас есть две других переменных countl, определенные внутри main (), поэтому по всей программе глобальная переменная countl скрыта локальными countl. Первый новый оператор вывода:
Здесь используется операция разрешения контекста (: :), поясняющая компиля- тору, что вы хотите обратиться к глобальной переменной countl, а не к локальной. Посмотрев на вывод программы, можно убедиться, что это работает.
Во вложенном блоке глобальная переменная countl скрыта за двумя переменны- ми по имени countl: внутренней и внешней. Мы можем видеть, что глобальная опе- рация разрешения контекста выполняет свою работу и во внутреннем блоке, как до- казывает вывод, генерируемый еще одним добавленным оператором:
Оно отображает значение 100, как и ранее — "длинная рука" операции разрешения контекста, использованной в такой манере, всегда достанет глобальную переменную.
Ранее вы уже видели, что можно сослаться на имя в пространстве имен std, дополнив его именем этого пространства имен— как, например, в случае std: :cout и std: :endl. Компилятор ищет указанное имя в пространстве имен, имя которого совпадает с левым операндом операции разрешения контекста. В предыдущем примере вы использовали опера- цию разрешения контекста для поиска в глобальном пространстве переменной countl. Тем, что перед оператором не было указано имя пространства имен, вы сообщили компилятору, что для поиска имени он должен обратиться к глобальному пространству имен.
Данные,
переменные
и
вычисления
Вы узнаете еще больше об этой операции, когда в главе 9 пойдет речь об объектно- ориентированном программировании, где она применяется очень широко.
Статические переменные
Вероятно, рано или поздно вам понадобится иметь переменную, которая опреде- лена и доступна локально, но продолжает существовать после выхода из блока, в ко- тором она объявлена. Другими словами, необходимо иметь возможность объявить переменную, имеющую область видимости в пределах блока, но обеспечить ей ста- тическое время хранения. Спецификатор static обеспечивает такую возможность, а потребность в ней станет более очевидной, когда мы будем говорить о функциях в главе 5.
На самом деле статическая переменная существует на протяжении всего времени жизни программы, даже если она объявлена внутри блока и доступна только в нем (или в его подблоках). Она также имеет область видимости блока, но при этом имеет и статическое время хранения. Чтобы объявить статическую целочисленную пере- менную count, вы должны написать так:
Если вы не предоставляете статической переменной начальное значение при ее объявлении, она будет инициализирована значением по умолчанию, а именно — ну- лем. Значение инициализации по умолчанию для статических переменных всегда рав- но 0, преобразованному к типу данной переменной. Напомним, что автоматических переменных это правило не касается.
Если вы не инициализируете свои автоматические переменные, они будут содержать мусор—значе- ния, которые остались в выделенной для них памяти от предыдущих запусков других программ.
Пространства имен
Я уже несколько раз упоминал о пространствах имен, так что теперь наступило время дать более точное представление об этом понятии. Пространства имен не при- меняются в библиотеках, поддерживающих MFC, но библиотеки, поддерживающие CLR и Windows Forms, используют их интенсивно, и стандартная библиотека ANSI С++, конечно, тоже.
Вы уже знаете, что все имена, используемые в стандартной библиотеке ISO/ANSI С++, определены в пространстве имен std. Это значит, что все имена, встречающие- ся в стандартной библиотеке, имеют дополнительное квалифицирующее имя — std, поэтому cout, например — это на самом деле std: : cout. Вы можете видеть примене- ние полных квалифицированных имен в следующем тривиальном примере.