|
Программирование >> Поддержка объектно-ориентированного программирования
Возможность использовать скрытое локальное имя отсутствует. Область видимости имени начинается в точке его описания (по окончании описателя, но еще до начала инициализатора - см. $$R.3.2). Это означает, что имя можно использовать даже до того, как задано его начальное значение. Например: int x; void f3() int x = x; ошибочное присваивание Такое присваивание недопустимо и лишено смысла. Если вы попытаетесь транслировать эту программу, то получите предупреждение: использование до задания значения Вместе с тем, не применяя оператора ::, можно использовать одно и то же имя для обозначения двух различных объектов блока. Например: int x = 11; void f4() извращенный пример int y = x; int x = 22; y = x; глобальное x локальное x Переменная y инициализируется значением глобального x, т.е. 11, а затем ей присваивается значение локальной переменной x, т.е. 22. Имена формальных параметров функции считаются описанными в самом большом блоке функции, поэтому в описании ниже есть ошибка: void f5(int x) int x; Здесь x определено дважды в одной и той довольно тонкая ошибка. ошибка области видимости. Это хотя и не слишком редкая, но 2.1.2 Объекты и адреса Можно выделять память для переменных , не имеющих имен, и использовать эти переменные. Возможно даже присваивание таким странно выглядящим переменным , например, *p[a+10]=7. Следовательно, есть потребность именовать нечто хранящееся в памяти . Можно привести подходящую цитату из справочного руководства: Любой объект - это некоторая область памяти, а адресом называется выражение, ссылающееся на объект или функцию ($$R.3.7). Слову адрес (lvalue -left value, т.е. величина слева) первоначально приписывался смысл нечто, что может в присваивании стоять слева . Адрес может ссылаться и на константу (см. $$2.5). Адрес, который не был описан со спецификацией const, называется изменяемым адресом. 2.1.3 Время жизни объектов Если только программист не вмешается явно, объект будет создан при появлении его определения и уничтожен, когда исчезнет из области видимости. Объекты с глобальными именами создаются, инициализируются (причем только один раз) и существуют до конца программы. Если локальные объекты описаны со служебным словом static, то они также существуют до конца программы. Инициализация их происходит, когда в первый раз управление проходит через описание этих объектов, например: int a = 1; void f() int b = 1; static int c cout << a = << a+ + инициализируется инициализируется при каждом вызове f() только один раз << b = << b++ << c = << c++ << \n; int main() while (a < 4) f(); Здесь программа выдаст такой результат: a = 1 b = 1 c = 1 a = 2 b = 1 c = 2 a = 3 b = 1 c = 3 Из примеров этой главы для краткости изложения исключена макрокоманда #include <iostream>. Она нужна лишь в тех из них, которые выдают результат. Операция ++ является инкрементом, т. е. a++ означает: добавить 1 к переменной a. Глобальная переменная или локальная переменная static, которая не была явно инициализирована, инициализируется неявно нулевым значением (#2.4.5). Используя операции new и delete, программист может создавать объекты, временем жизни которых он управляет сам (см. $$3.2.6). 2.2 ИМЕНА Имя (идентификатор) является последовательностью букв или цифр. Первый символ должен быть буквой. Буквой считается и символ подчеркивания . Язык С++ не ограничивает число символов в имени. Но в реализацию входят программные компоненты, которыми создатель транслятора управлять не может (например, загрузчик), а они, к сожалению, могут устанавливать ограничения. Кроме того, некоторые системные программы, необходимые для выполнения программы на С++, могут расширять или сужать множество символов, допустимых в идентификаторе. Расширения (например, использование $ в имени) могут нарушить переносимость программы. Нельзя использовать в качестве имен служебные слова С++ (см. $$R.2.4), например: hello this is a most unusially long name DEFINED foO bAr u name HorseSense var0 var1 CLASS class Теперь приведем примеры последовательностей символов, которые не могут использоваться как идентификаторы: 012 a fool $sys class 3var pay.due foo~bar .name if Заглавные и строчные буквы считаются различными, поэтому Count и count - разные имена. Но выбирать имена, почти не отличающиеся друг от друга, неразумно. Все имена, начинающиеся с символа подчеркивания, резервируются для использования в самой реализации или в тех программах, которые выполняются совместно с рабочей, поэтому крайне легкомысленно вставлять такие имена в свою программу. При разборе программы транслятор всегда стремится выбрать самую длинную последовательность символов, образующих имя, поэтому var1 0 - это имя, а не идущие подряд имя var и число 10. По той же причине elseif - одно имя (служебное), а не два служебных имени else и if. 2.3 ТИПЫ С каждым именем (идентификатором) в программе связан тип. Он задает те операции, которые могут применяться к имени (т.е. к объекту, который обозначает имя), а также интерпретацию этих операций. Приведем примеры: int error number; float real(complex* p); Поскольку переменная error number описана как int (целое), ей можно присваивать, а также можно использовать ее значения в арифметических выражениях. Функцию real можно вызывать с параметром, содержащим адрес complex. Можно получать адреса и переменной, и функции. Некоторые имена, как в нашем примере int и complex, являются именами типов. Обычно имя типа нужно, чтобы задать в описании типа некоторое другое имя. Кроме того, имя типа может использоваться в качестве операнда в операциях sizeof (с ее помощью определяют размер памяти, необходимый для объектов этого типа) и new (с ее помощью можно разместить в свободной памяти объект этого типа). Например: int main() int* p = new int; cout << sizeof(int) = << sizeof(int) \n; Еще имя типа может использоваться в операции явного преобразования одного типа к другому ($$3.2.5), например: float f; char* p; ... long ll = long(p); преобразует p в long int i = int(f); преобразует f в int 2.3.1 Основные типы Основные типы С++ представляют самые распространенные единицы памяти машин и все основные способы работы с ними. Это: char short int int long int Перечисленные типы используются для представления различного размера целых. Числа с плавающей точкой представлены типами: float double long double Следующие типы могут использоваться для представления без знаковых целых, логических значений, разрядных массивов и т.д.: unsigned char unsigned short int unsigned int unsigned long int Ниже приведены типы, которые используются для явного задания знаковых типов: signed char signed short int signed int signed long int Поскольку по умолчанию значения типа int считаются знаковыми, то соответствующие типы с signed являются синонимами типов без этого служебного слова. Но тип signed char представляет особый интерес: все 3 типа - unsigned char, signed char и просто char считаются различными (см. также $$R.3.6.1). Для краткости (и это не влечет никаких последствий) слово int можно не указывать в многословных типах, т.е. long означает long int, unsigned - unsigned int. Вообще, если в описании не указан тип, то предполагается, что это int. Например, ниже даны два определения объекта типа int: const a = 1; небрежно, тип не указан static x; тот же случай
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |