Владимир Волков - Программирование для карманных компьютеров
Для имени, объявленного в теле функции ( локальное имя), область видимости начинается с места объявления и заканчивается там, где заканчивается блок, внутри которого было объявлено имя. Блоком считается фрагмент кода, заключенный в фигурные скобки.
РРјСЏ называется глобальным, если РѕРЅРѕ объявлено РІРЅРµ любой функции или класса. Область видимости глобального имени простирается РѕС‚ места объявления РґРѕ конца файла, содержащего объявление. Внешнее РїРѕ отношению Рє текущему блоку РёРјСЏ, как глобальное, так Рё локальное, может быть перекрыто (то есть подменено) объявлением этого же имени внутри текущего блока. Р’ этом случае РІ памяти образуется РґРІР° или более разных объектов СЃ РѕРґРЅРёРј Рё тем же именем. РўРѕ есть РёРјСЏ внутри блока может быть замещено Рё будет ссылаться РЅР° РґСЂСѓРіСѓСЋ область памяти. РџСЂРё выходе РёР· блока РёРјСЏ восстанавливает СЃРІРѕРµ значение. Рљ замещенному глобальному имени можно обратиться РїСЂРё помощи оператора::. Рљ скрытому локальному имени обратиться невозможно. Ртот механизм иллюстрируется РІ упражнении.
Упражнение 4.1 (продолжение)
19. Добавить в программу код, приведенный в листинге 4.9. Нужно при этом объявить соответствующую функцию и добавить еще одну ветвь case.
Листинг 4.9
// Блок 16
void f4(){
//В начале файла объявлена глобальная переменная mm, указывающая на массив
//типа char, то есть на массив символов, то есть на строку. Устанавливая
//первым элементом массива 0, мы показываем, что это строка пустая. Затем,
//при помощи функции strcat, мы добавляем к этой строке строку Hello, Global
//Word! с символом переноса на другую строку n.
mm[0] = ;
strcat(mm, В«Hello, Global Word! nВ»);
//Снова объявляем переменную mm, чем скрываем имя глобальной переменной mm.
//Теперь обращаясь к mm, мы обращаемся к локальному имени, указывающему на
//другую область памяти. В эту другую область мы записываем строку Hello,
//Local Word!
char mm[256];
mm[0] = ;
strcat(mm, В«Hello, Local Word! nВ»);
//К строке из локальной переменной mm, мы дописываем строку из глобальной
//переменной mm, обращаясь к глобальной переменной при помощи оператора
//разрешения области видимости::
strcat(mm,mm);
mbstowcs(mstr, mm, 256);
szStr = mstr;
}
Комментарии в тексте поясняют действие кода. После запуска программы нужно нажать клавишу 4. На экран будет выведено следующее сообщение:
Hello, Local Word! Hello, Global Word!
Поскольку ошибки, связанные с ненамеренным замещением имен трудно обнаружить, особенно в большой программе, следует придерживаться следующих правил.
? Чем более глобальное имя было создано, тем более описательный характер, позволяющий понять функциональную нагрузку имени и область, оно должно носить.
? Рмена РёР· локальной области видимости хорошо делать однобуквенными.
? Чем чаще используется имя, тем короче его надо делать.
? РРјСЏ должно отображать смысл использования объекта, Р° РЅРµ детали его представления.
? Нужно записывать имена макросов заглавными буквами.
? Следует отделять слова внутри имени символом подчеркивания.
Объекты и lvalue (левые значения)
Когда для хранения тех или иных данных выделяется некоторая непрерывная область памяти, эта операция создает объект. В С++ разработчик может создавать области памяти и хранить там данные, не присваивая этим объектам имен. Но если вы такому объекту все же присваивается имя, то этим создается так называемое lvalue , то есть нечто, что может быть использовано в левой части оператора присваивания. Когда вы создаете переменную, вы создаете модифицируемое lvalue . При создании константы возникает константное lvalue .
Объект, объявленный в функции, создается в момент его определения и живет до выхода из функции. Такого рода объекты называются автоматическими или локальными . Глобальные объекты, а также статические объекты, объявленные в функциях и классах, живут до тех пор, пока не закончится программа.
Объекты, созданные явно при помощи оператора new, уничтожаются оператором delete, и программист непосредственно управляет временем их жизни. Такие объекты называются динамическими .
typedef
Объявление, начинающееся с ключевого слова typedef, вводит новое имя для типа.typedef char* Pchar;
Рта конструкция создает РЅРѕРІРѕРµ РёРјСЏ для уже имеющегося типа «указатель РЅР° символ». Таким образом, ключевое слово typedef позволяет создавать СЃРёРЅРѕРЅРёРјС‹ уже имеющимся типам.
Выражения
Выражения – это операторы, операнды и разделители, определяющие некоторое вычисление и возвращающие значение. В следующем разделе будут рассматриваться основные операторы языка С++, а в этом разделе нужно коснуться приоритета выполнения операторов в выражениях. Правильное понимание того, в каком порядке будут выполняться операторы, поможет избежать многих досадных ошибок, которые не в состоянии обнаружить компилятор. В справочной системе, в разделе, посвященном языку C/C++, есть страница Operator Precedence and Associativity, посвященная этому вопросу. На этой странице указаны практически все операторы языка C++.