
- •Описания и Константы
- •2.1 Описания
- •2.1.1 Область Видимости
- •2.1.2 Объекты и Адреса (Lvalue)
- •2.1.3 Время Жизни
- •2.2 Имена
- •2.3 Типы
- •2.3.1 Основные Типы
- •2.3.2 Неявное Преобразование Типа
- •2.3.3 Производные Типы
- •2.3.4 Тип void
- •2.3.5 Указатели
- •2.3.6 Вектора
- •2.3.7 Указатели и Вектора
- •2.3.8 Структуры
- •2.3.9 Эквивалентность типов
- •2.3.10 Ссылки
- •2.3.11 Регистры
- •2.4 Константы
- •2.4.1 Целые Константы
- •2.4.2 Константы с Плавающей Точкой
- •2.4.3 Символьные Константы
- •2.4.4 Строки
- •2.4.5 Ноль
- •2.4.6 Const
- •2.4.7 Перечисления
- •2.5 Экономия Пространства
- •2.5.1 Поля
- •2.5.2 Объединения
- •2.6 Упражнения
2.1.3 Время Жизни
Если программист не указал иного, то объект создается, когда встречается его описание, и уничтожается, когда его имя выходит из области видимости, Объекты с глобальными именами создаются и инициализируются один раз (только) и "живут" до завершения программы. Объекты, определенные описанием с ключевым словом static, ведут себя так же. Например *1:
int a = 1;
void f()
{
int b = 1; // инициализируется при каждом вызове f()
static int c = 1; // инициализируется только один раз
cout << " a = " << a++
<< " b = " << b++
<< " c = " << c++ << "\n";
}
main()
{
while (a < 4) f();
}
производит вывод
a = 1 b = 1 c = 1
a = 2 b = 1 c = 2
a = 3 b = 1 c = 3
Не инициализированная явно статическая (static) переменная неявно инициализируется нулем.
С помощью операций new и delete программист может также создавать объекты, время жизни которых управляется непосредственно; см. #3.2.4.
2.2 Имена
Имя (идентификатор) состоит из последовательности букв и цифр. Первый символ должен быть буквой. Символ подчерка _ считается буквой. C++ не налагает ограничений на число символов в имени, но некоторые части реализации находятся вне ведения автора компилятора (в частности, загрузчик), и они, к сожалению, такие ограничения налагают. Некоторые среды выполнения также делают необходимым расширить или ограничить набор символов, допустимых в идентификаторе; расширения (например, при допущении в именах символа $) порождают непереносимые программы. В качестве имени не могут использоваться ключевые слова C++ (см. #с.2.3). Примеры имен:
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 - различные имена, но вводить имена, лишь незначительно отличающиеся друг от друга, нежелательно. Имена, начинающиеся с подчерка, по традиции используются для специальных средств среды выполнения, поэтому использовать такие имена в прикладных программах нежелательно.
Во время чтения программы компилятор всегда ищет наиболее длинную строку, составляющую имя, поэтому var10 - это одно имя, а не имя var, за которым следует число 10; и elseif - одно имя, а не ключевое слово else, после которого стоит ключевое слово if.
2.3 Типы
|
2.3.1 Основные Типы |
|
2.3.2 Неявное Преобразование Типа |
|
2.3.3 Производные Типы |
|
2.3.4 Тип void |
|
2.3.5 Указатели |
|
2.3.6 Вектора |
|
2.3.7 Указатели и Вектора |
|
2.3.8 Структуры |
|
2.3.9 Эквивалентность типов |
|
2.3.10 Ссылки |
|
2.3.11 Регистры |
Каждое имя (идентификатор) в C++ программе имеет ассоциированный с ним тип. Этот тип определяет, какие операции можно применять к имени (то есть к объекту, на который оно ссылается), и как эти операции интерпретируются. Например:
int error number;
float real(complex* p);
Поскольку error_number описано как int, его можно присваивать, использовать в арифметических выражениях и т.д. Тогда как функция real может вызываться с адресом complex в качестве параметра. Можно взять адрес любого из них. Некоторые имена, вроде int и complex, являются именами типов. Обычно имя типа используется в описании для спецификации другого имени. Единственные отличные от этого действия над именем типа - это sizeof (для определения количества памяти, которая требуется для хранения объекта типа) и new (для размещения объекта типа в свободной памяти). Например:
main()
{
int* p = new int;
cout << "sizeof(int) = " << sizeof(int) "\n";
}
Имя типа можно также использовать для задания явного преобразования одного типа в другой, например:
float f;
char* p;
//...
long ll = long(p); // преобразует p в long
int i = int(f); // преобразует f в int