Чтение онлайн

на главную

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

Все инициализации автоматических (auto) и регистровых (register) переменных производятся каждый раз, когда выполняется оператор-описание. Уничтожение локальных переменных, описанных в блоке, происходит при выходе из блока (§R.6.6). Уничтожение автоматических переменных, определенных в цикле, происходит на каждом шаге цикла. Например, переменная Index j создается и уничтожается каждый раз в течение цикла по i:

for (int i = 0; i‹100; i++)

 for (Index j = 0; j‹100; j++) {

//…

 }

Выход из

цикла или из блока или переход, минуя инициализацию автоматических переменных, приводит к уничтожению автоматических переменных, описанных в точке, откуда происходит переход, но не в точке, куда происходит переход.

Переход в блок возможен при условии, что он не приводит к пропуску инициализации. Считается незаконным переход, обходящий описание с явной или неявной инициализацией, кроме случаев, когда оно находится во внутреннем блоке, который пропускается (т.е. в него никогда не попадает управление) или переход происходит из той точки, где уже была инициализация переменной. Например,

void f

{

 //…

 goto lx; // ошибка: переход, минуя инициализацию

 //…

 ly:

 X a = 1;

 //…

 lx:

 goto ly; // нормально, за переходом будет вызов

 // деструктора для `a'

}

Автоматическая переменная, которая была создана при некотором условии, уничтожается при выполнении этого условия, и не может быть доступна вне проверки этого условия. Например,

if (i)

 for (int j = 0; j‹100; j++) {

//…

 }

if (j !=100) // ошибка: обращение вне условия

 //…

;

Инициализация локального объекта с классом памяти static (§R.7.1.1) производится прежде, чем управление пройдет через область его описания. Если статическая переменная инициализируется выражением, которое не является выражением-константой, то перед первым входом в блок происходит стандартная инициализация нулем, приведенным к нужному типу (§R.8.4).

Деструктор для локального статического объекта будет вызываться в том и только в том случае, если переменная была создана с помощью конструктора. Деструктор должен вызываться сразу перед вызовом или как составная часть вызова функций, заданных в atexit (§R.3.4).

R.6.8 Разрешение неоднозначности

Существует неоднозначность в грамматике языка, касающаяся оператора-выражения и описания, а именно, оператор-выражение, содержащий как самое левое подвыражение явное преобразование типа, заданное в функциональном стиле (§R.5.2.3), может быть не отличим от описания, в котором первый описатель начинается со (. В таких случаях оператор считается описанием.

Для разрешения неоднозначности следует исследовать весь оператор, чтобы определить является он оператором-выражением или описанием. Так устраняется неоднозначность во многих случаях. Например, пусть T - имя-простого-типа (§R.7.1.6),

тогда имеем

T(a)-›m = 7; // оператор-выражение

T(a)++; // оператор-выражение

T(a,5) ‹‹ c; // оператор-выражение

T(*e)(int); // описание

T(f)[]; // описание

T(g) = { 1, 2 }; // описание

T(*d)(double(3)); // описание

Остальные случаи представляют описания. Например,

T(a); // описание

T(*b); // описание

T(c)=7; // описание

T(d),e,f=3; // описание

T(g)(h,2); // описание

Неоднозначность здесь чисто синтаксическая, т.е. на ее разрешение не влияет тот факт, является ли имя именем-типа или нет.

Есть другой вид коллизии между оператором-выражением и описанием, который разрешается требованием, чтобы описание функции в блоке (§R.6.3) сопровождалось именем-типа, например:

void g

{

 int f; // описание

 int a; // описание

 f; // оператор-выражение

 a; // оператор-выражение

}

R.7 Описания

Описания используются для интерпретации каждого из идентификаторов; необязательно, чтобы они сопровождались выделением памяти, сопоставляемой с идентификатором. Описания имеют вид

описания:

 спецификации-описания opt список-описателей opt;

 описание-asm

 определение-функции

 спецификация-связи

Описатели в списке-описателей (§R.8) содержат описываемые идентификаторы. Конструкция спецификации-описания может отсутствовать только в определении функций (§R.8.3) или в описании функций. Список-описателей может быть пустым, только при описании класса (§R.9) или перечисления (§R.7.2), т.е. когда спецификация-описания есть спецификация-класса или спецификация-перечисления. Конструкция описание-asm объясняется в §R.7.3, а спецификация-связи в §R.7.4. Описание происходит в определенной области видимости (§R.3.2), правила области видимости приводятся в §R.10.4.

R.7.1 Спецификации

В описании можно использовать следующие спецификации:

спецификация-описания:

 спецификация-класса-памяти

 спецификация-типа

 спецификация-fct

 спецификация-шаблона-типа

 friend

 typedef

спецификации-описания:

 спецификации-описания opt спецификация-описания

Поделиться:
Популярные книги

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Провинциал. Книга 7

Лопарев Игорь Викторович
7. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Провинциал. Книга 7

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Путь (2 книга - 6 книга)

Игнатов Михаил Павлович
Путь
Фантастика:
фэнтези
6.40
рейтинг книги
Путь (2 книга - 6 книга)

Гром над Империей. Часть 1

Машуков Тимур
5. Гром над миром
Фантастика:
фэнтези
5.20
рейтинг книги
Гром над Империей. Часть 1

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род