- Любовные романы
- Фантастика и фэнтези
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
C++ - Страустрап Бьярн
Шрифт:
Интервал:
Закладка:
Конструкторы для нелокальных статических объектов вызваются в порядке их появления в файле; деструкторы для вызываются в обратном порядке. Вызывается ли конструктор или деструктор для локального статического объекта в случае если функция, в которой объект описан, не вызывается, не определно. Если конструктор для локального статического объекта взывается, то он вызывается после конструкторов для глобальных объектов, лексически ему предшествующих. Если для локального статического объекта вызывается деструктор, то он вызывается до деструкторов для глобальных объектов, лексически ему прешествующих.
8.6.3 Ссылки
Когда переменная описана как T amp;, то есть «ссылка на тип T», она должна быть инициализирована или объектом типа T, или объектом объектом, который может быть преобразован в T. Ссыка становится другим именем объекта. Например:
int i; int amp; r = i; r = 1; // значение i становится 1 int* p = amp;r; // p указывает на i
Значение ссылки не может быть изменено после инициализции. Заметьте, что обработка инициализации ссылки очень силно зависит от того, что ей присваивается. Если инициализатор для ссылки на тип T не является lvalue, то будет создан и инициализован инициализатором обект типа T. Тогда ссылка станет именем для этого объекта. Время жизни объекта, созданного таким способом, будет область видимости, в которой он создан. Например:
double amp; rr = 1;
допустимо, и rr будет указывать на объект типа double, содержащий значение 1.0.
Заметьте, что ссылка на класс B может быть инициализирвана объектом класса D при условии, что B является открытым базовым классом класса D (в этом случае D есть B).
Ссылки особенно полезны в качестве типов параметров. Например:
struct B (* ... *); struct D : B (* ... *); int f(B amp;); D a; f(a);
8.6.4 Массивы символов
Массив char можно инициализировать строкой. Последовтельные символы строки инициализируют члены массива. Напрмер:
char msg[] = «Syntax error on line %dn»;
демонстрирует массив символов, члены которого инициалзированы строкой. Обратите внимание, что sizeof(msg)==25.
8.7 Имена типов
Иногда (для неявного задания преобразования типов и в качестве параметра sizeof или new) нужно использовать имя тпа данных. Это выполняется при помощи «имени типа» которое по сути является описанием для объекта этого типа, в котором опущено имя объекта.
имя_типа: спецификатор_типа абстрактный_описатель
абстрактный_описатель: пустой * абстрактный_описатель абстрактный_описатель ( списоко_писателей_параметров) абстрактный_описатель [ константное_выражение opt ] ( абстрактный_описатель )
Возможно единственным образом идентифицировать положение в абстрактном_описателе, где должен стоять идентификатор в случае, если бы конструкция была описателем в описании. Тогда именованный тип является – тот же, что и тип гипотетического идентификатора. Например,
int int * int *[3] int (*)[3] int *() int (*)()
именуют, соответсвенно, типы «целое», «указатель на цлое», «массив из 3 указателей на целые», «указатель на массив из 3 целых», «функция, возвращающая указатель на целое» и «указатель на функцию, возвращающую целое».
8.8 Typedef – определение типа
Описания, содержащие спецификатор_описания typedef, определяют идентификаторы, которы позднее могут использоваться так, как если бы они были ключевыми словами, именующими оновные или производные типы.
typedef-имя: идентификатор
Внутри области видимости описания, содержащего typedef, каждый идентификатор, возникающий как часть какого-либо опсателя, становится в этом месте синтаксически эквивалентным ключевому слову типа, которое именует тип, ассоциированный с идентификатором таким обрахом, как описывается в #8.4. Спецфикатор_описания typedef не может использоваться для члена класса. Имя класса или перечисления также является typedef-именем. Например, после
typedef int MILES, *KLICKSP; struct complex (* double re, im; *);
каждая из конструкций
MILES distance; extern KLICKSP metricp; complex z, *zp;
является допустимым описанием; distance имеет тип int, metricp имеет тип «указатель на int».
typedef вводит не новые типы, но только синонимы для тпов, которые могли бы быть определены другим путем. Так в приведенном выше примере distance рассматривается как имеющая в точности тот же тип, что и любой другой int объект.
Но описание класса вводит новый тип. Например:
struct X (* int a; *); struct Y (* int a; *); X a1; Y a2; int a3;
описывает три переменных трех различных типов.
Описание вида
описание_имени: сост идентификатор ; enum идентификатор ;
специфицирует, что идентификатор является именем некотрого (возможно, еще не определенного) класса или перечислния. Такие описания позволяют описывать классы, ссылающихся друг на друга. Например:
class vector;
class matrix (* // ... friend vector operator*(matrix amp;, vector amp;); *);
class vector (* // ... friend matrix operator*(matrix amp;, vector amp;); *);
8.9 Перегруженные имена функций
В тех случаях, когда для одного имени определено неколько (различных) описаний функций, это имя называется прегруженным. При использовании этого имени правильная функция выбирается с помощью сравнения типов фактических параметров с типами формальных параметров в описаниях функций.
Поиск того, какую функцию вызвать, осуществляется в три отдельных шага:
Искать точно соответствующую и использовать, если найдна.
Искать соответствующую с использованием стандартных пробразований (#6.6-8) и использовать любую найденную.
Искать соответствующую с использованием определенных пользователем преобразований (#6.5.6). Если найдено единтвенное множество преобразований, использовать ее.
Ноль, char или short считаются точно соответствующими формальному параметру типа int. Float считаются точно сооветствующими формальному параметру типа double.
Над параметром перегруженной функции выполняются только следующе преобразования: int в long, int в double и преобрзования указателей и ссылок (#6.7-8).
Для того, чтобы перегрузить имя функции не члена и не функции operator, любому описанию функции должно предшестввать описание overload, см. #8.1. Например:
overload abs; double abs(double); int abs(int);
abs(1); // вызывается abs(int); abs(1.0); // вызывается abs(double);
Например:
class X (* ... X (int); *); class Y (* ... Y (int); *);
class Z (* ... Z (char*); *);
overload int f (X), f (Y); overload int g (X), g (Z);
f (1); // недопустимо: f(X(1)) или f(Y(1)) g (1); // g(X(1)) g («asdf»); // g(Z(«asdf»))
Операция взятия адреса amp; может применяться к перегруженому имени только в присваивании или инициализации, когда ожидаемый тип определяет, адрес какой функции брать. Напрмер:
int operator=(matrix amp;, matrix amp;); int operator=(vector amp;, vector amp;); int (*pfm)(matrix amp;, matrix amp;) = amp;operator=; int (*pfv)(vector amp;, vector amp;) = amp;operator=; int (*pfx)(...) = amp;operator=;
8.10 Описания перечислений
Перечисления являются типами int с именованными констатами.
enum_спецификатор: enum идентификатор opt (* enum_список *)
enum_список: перечислитель enum_список , перечислитель
перечислитель: идентификатор идентификатор = константное_выражение
Идентификаторы в enum-списке описаны как константы и мгут появляться во всех местах, где требуются константы. Если не появляется ни одного перечислителя с =, то значения сооветствующих констант начинаются с 0 и возрастают на 1 по мере чтения описания слева нарпаво. Перечислитель с = дает ассоцированному с ним идентификатору указанное значение; последущие идентификаторы продолжают прогрессию от присвоенного знчения.