Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

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; // инициализируется при каждом вызове f()

static int c = a; // инициализируется только один раз

cout << " a = " << a++

<< " 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 - разные имена. Но выбирать имена, почти не отличающиеся

друг от друга, неразумно. Все имена, начинающиеся с символа

подчеркивания, резервируются для использования в самой реализации

или в тех программах, которые выполняются совместно с рабочей,

поэтому крайне легкомысленно вставлять такие имена в

свою программу.

При разборе программы транслятор всегда стремится выбрать самую

длинную последовательность символов, образующих имя, поэтому var10

- это имя, а не идущие подряд имя var и число 10. По той же причине

elseif - одно имя (служебное), а не два служебных имени else и if.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]