Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 28
Текст из файла (страница 28)
Можно использовать одно имя для ссылки на два различных объекта в блоке без ,и пользования оператора::. Например: тех=11; иоЫ/4 () Сокрытие имен неизбежно при написании больших программ. Однако читающий программу может не заметить того, что какое-то имя <спряталосьь Ввиду того, что такнс ошибки встречаются сравнительно редко, их очень трудно обнаружить. Поэтомуу следует овеет ц к минимуму сокрытие имен. Хотите иметь проблемы — используйте имена типа 1 илп х в качестве глобальных переменных нлн в качестве локальных переменных в больших функциях. К скрытому глобальному имени можно обратиться с помощью оператора разрешения области видимости::. Например: Глава 4.
Типы и объявления 122 ш/у = х;,/,/глобальная х.' 0 = // ш/х = 22; д = х; О локальная х: д = 22 Считается, что имена аргументов функции объяв. лены в самом внешнем блоке функ- ции, поэтому ооЫ23 (ш/ х) ( ш/х; Оошибка: повторное определение является ошибкой, так как переменная х дважды определяется в пределах одной и той же области видимости. Отнесение подобных ситуаций к числу запрешенных по- зволяет (компилятору) отловить нетривиальные, тонкие ошибки. 4.9.5. Инициализация Если для объекта указан инициализатор, он определяет начальное значение обьекта. Если инициализатор не задан, то глобальным объектам Я 4.9.4), объектам из пространства имен Я 8.2) и локальным статическим объектам (ч 7.1.2, 9 10.2А) (все вместе онп называются статическими обьектами) присваивается нулевое значение соответствующего типа.
Например: /и/а; г//означает ш/о = 0; с/оиб/е д, //означает двине д= 0.0; Локальные перемени/яе (иногда называемые аетомапгичвскими обьвктами) и объекты, создаваемые в области свободной памяти (пногда называемые диналшчегкими объектива или обьекталги из кучи), пе инициализируются по умолчаншо. Например: ио/с//0 ( /п/ х, !l) //х не имеет надежно определенного значения /и/а() = ( /, 2 ); г// инияиализаогор л~ассива Элементы массивов и члены структур инициализируются или нет в зависимости от того, являются ли они статическими. Для типов, определяемых пользователем, может определяться инициализация по умолчанию Я 10.4.2).
Сложные объекты требуют более одного инициалпзатора. Для массивов п структур используется синтаксис списков инициализаторов, принятый в С. Список значений заключается в фигурные скобки ( ) Я 5.2.1, 9 5.7). Для инициализации типов, определяемых пользователем, применяются конструкторы с синтаксисом вызова функции Я 2.5.2, 9 10.2.3). Обратите внимание на то, что «пустая» пара круглых скобок () в объявлении всегда означает функцию Я 7.1). Примеры; 123 4.9. Объявления /1 и ницнвяизагпар в стпя е функции (вазов конггпрукнгпра) 11 объяв.ение функции Рат1е (1,2(; (п12 ((, 4.9.6.
Объекты и !ча!ое 4.9.7. 1урес!е( Объявление, начинающееся с ключевого слова 1урейеу, вводит новое имя для типа, а не для переменной данного типа. Например: 1урейе1 сваг» Рс(лаг; Рспагр1,р2, с(лаг'рЗ =р1; гггГ р! и р2 пш па сваг* Целью такого объявления часто является назначение короткого синонима для часто используемого типа. Например, при частом примененииипз10пейсйагможно ввести синоним ис)лаг. 1урейе~ ипз(улей сваг и сваг; Другое использование 1урейе1 — свести в одно место все непосредственные ссылки на какой-то тип. Например: !урейе1 т11п132, 1урейе)'зЬагг (п11б; Допускается выделять память и «использовать переменные», у которых нет имен, а также присваивать значения странно выглядящим выражениям (например, *р(а+10)=10).
Соответственно, возникает потребность в названии для <чего-то в памяти». Это и есть самос простое и фундаментальное понятие объекта. А именно — обьвкт есть непрерывная область памяти. Ага!ив (именующее выражение)— это выражение, ссылающееся на объект. Исходным смыслом!иа!пе (от английского «!е!г ча!ие» вЂ” значение в левой части) было «нечто, что молгет быть использовано в левой части оператора присваивания». Однако не каждое !ча(пе может использоваться в левой части оператора присваивания. !.ча!пе может ссылаться на константу Я 5.5). лиа!пе, которос не было объявлено константой, часто называют згодигрицирувмьгяг 1гга!ив. Приведенное простое низкоуровневое понятие объекта пе следует путать с понятиями объекта класса или объекта полпморфного типа Я 15.4.3).
Если программист не указал явно иное Я 7.1.2, 9 10.4.8), объект, объявленный в функции, создается, когда встречается его определение, а уничтожается в момент выхода его имени из области видимости Я 10.4.4). Такие объекты называются автоматическими. Объекты, объявленные глобально нли в пространстве имен, а так;не статические объекты, объявленные в функциях пли классах, создаются и инициализируются лишь однажды и «живут», пока не завершится программа Я 10.4.9). Такие объекты называются статическими. Время жизни элементов массивов и нестатических членов структур или классов определяется объектами, частью которых они являются.
Создавая объекты операторалли лет и йе1е1е Я 6.2.6), вы непосредственно управляете временем их жизни, Глава 4. Типы и объявления 124 Таким образом, используя 1п132 везде, где могут потребоваться большие числа, мы можем перенести наше приложение на машину с в1геот'[1п1] == 2, просто заместив единственную строчку кода с тй ~уреНе7" 1опу 1па72; Хорошо это нли плохо, цо имена, вводимые 1уреае1, являются синонимамп, а не новыми типами. Следовательно, старые типы можно использовать совместно с нх синонимами. Если вам нужны различные типы с одинаковой семантикой пли с одинаковым представлением, обратитесь к перечислениям Я 4.8) пли классам (глава 10).
4.10. Советы [1) Ограничивайте область видимости имен; 6 4.9.4. [2] Не используйте одно и то же пмя н в текущей, и в объемлющей областях видимости; 3 4.9А. )3) В каждом объявлении объявляйте только одно имя; з 4.9.2. ) 4) Локальным и часто используемым переменным присваивайтс короткие имена; глобальным и редко используемым — длинные; 9 4.9.3. [5] Избегайте внешне похожих имен; Я 4.9.3. [6] Старайтесь придерживаться единого стиля именования; 9 4.9.3.
[7] Выбирзйтс имена, отражающие смысл, а не форму представления; 9 4.9.3. [8] Используйте 1уредеу'для введения осмысленного нового имени встроенного типа, если этот встроенный тип, представляющий некоторое значение, может подлежать замене; 9 4.9.7. [9] Применяйте 1урес[е7для задания синонимов типов; используйте перечисления и классы для определения новых типов; 9 4.9.7. [10] Помните, что в каждом объявлении должен быть указан тип (больше не существует правила «неявного 1п1»); 9 4.9.1.
[11) Избегайте избыточных предположений о численных аначениях символов; 5 4.3.1, ~ В.6.2.1. [12] Избегайте избыточных предположений о размере целых; 9 4.6. [13] Избегайтс избыточных предположений о диапазоне значений чисел г плавающей точкой; 9 4.6. [14] Предпочитайте.
]п1 по сравнению с зйог1 т1 или 1опутй З 4.6. [15] Предпочитайте с[оаЫе по сравнению сЯоа1 или 1опдс[оиЫе; 9 4.5. [16] Предпочитайте сйаг по сравненшо с яупеН сйаг нли ипз1упес[ сйас 9 В.3А. [17] Избегайтс избыточных предположений о размерах объектов; 6 4.6. [18] Избегайте беззнаковой арифметики; з 4А. [19] С подозрением относитесь к преобразованиям изз1упедв ипз1упег1 и пз ипв1дпеЫ в залег[; 9 В.6.2.6. [20] С подозрением относитесь к преобразованиям чисел с плавающей точкой в целые; 9 В.6.2.6.
[21] С подозрением относитесь к преобразованиям в «укороченные» типы, например, 1п1 в спас, 9 В.6.2.6. 4.11. Упражнения 125 4.11. Упражнения 1. (*2) Запустите программу «Здравствуй, ьчир! ь Я 3.2). Если не получится, обратитесь к з В.3.1. 2. (*1) Проделайте слсдуюп1ее для каждого объявления в з 4кй если объявление не является определением, дошпцпте определение. Если объявление является определснпем, напишите соответствующее объявление, которое нс является определением. 3. (*1.5) Напишите программу, которая печатает размеры фундаментальных типов, нескольких типов указателей н нескольких перечислений по вашему выбору.
Воспользуйтесь оператором з!геок 4. ("1.5) Напишите программу, которая печатает символы от 'а'до 'г' и цифры от 'О' до '9' н пх целые значения. Проделайте то же самое для других печатаемых символов. Продслайтс то жс самое, но воспользуйтесь шестнадцатерпчпгам представлением чисел. 5. !'2) Каковы в вашей системе максимальные п минимальные значения переменных следующих типов: с?гаг, зЬог1, !лд !олд Яоа1, г?оиЫе, !опи г?оиЫе и ипз!йаег?? 6. ('1) Какой максимальной длины может быть локальное цмя в программе на Сжж в вашей системс? Какой ьгаксимальной длины мо'кет быть внешнее имя в программе на С ж в вашем системе? Суагествуют ли какие-либо ограничения на использование символов в именах? 7. !'2) Нарисуйте граф цслых и фундаментальных типов, где от одного типа идет стрелка к другоьгу, если все значения первого типа могут быть представлены значениями второго в любой реализации, соответствующей стандарту. Нарисуйте такой граф для типов вашей любигиой реализации.