straustrup2 (852740), страница 40

Файл №852740 straustrup2 (Бьерн Страуструп. Язык программирования С++) 40 страницаstraustrup2 (852740) страница 402021-10-05СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 40)

Такую гарантию можно получить, если заключить объединение в класс, в котором будетотслеживаться тип заносимого значения :class tok_val {public:enum Tag { I, D, S, N };private:union {const char* p;char v[8];long i;double d;};Tag tag;void check(Tag t) { if (tag != t) error(); }public:Tag get_tag() { return tag; }tok_val(const char* pp);tok_val(long ii){ i = ii; tag = I; }tok_val(double dd) { d = dd; tag = D; }long& ival(){ check(I); return i;double& fval(){ check(D); return d;const char*& sval() { check(S); return p;char* id(){ check(N); return v;};tok_val::tok_val(const char* pp){if (strlen(pp) <= 8) {tag = N;strncpy(v,pp,8);}else {tag = S;p = pp;}}}}}}// короткая строка// длинная строка// записывается только указательИспользовать класс tok_val можно так:void f(){tok_val t1("короткая");tok_val t2("длинная строка");char s[8];strncpy(s,t1.id(),8);strncpy(s,t2.id(),8);}// присваивается v// присваивается p// нормально// check() выдаст ошибку141Бьерн Страуструп.Язык программирования С++Описав тип Tag и функцию get_tag() в общей части, мы гарантируем, что тип tok_val можноиспользовать как тип параметра.

Таким образом, появляется надежная в смысле типов альтернативаописанию параметров с эллипсисом. Вот, например, описание функции обработки ошибок, котораяможет иметь один, два, или три параметра с типами char*, int или double:extern tok_val no_arg;void error(const char* format,tok_val a1 = no_arg,tok_val a2 = no_arg,tok_val a3 = no_arg);5.5 Конструкторы и деструкторыЕсли у класса есть конструктор, он вызывается всякий раз при создании объекта этого класса.

Если укласса есть деструктор, он вызывается всякий раз, когда уничтожается объект этого класса. Объектможет создаваться как:[1]автоматический, который создается каждый раз, когда его описание встречается привыполнении программы, и уничтожается по выходе из блока, в котором он описан;[2]статический, который создается один раз при запуске программы и уничтожается при еезавершении;[3]объект в свободной памяти, который создается операцией new и уничтожается операциейdelete;[4]объект-член, который создается в процессе создания другого класса или при создании массива,элементом которого он является.Кроме этого объект может создаваться, если в выражении явно используется его конструктор ($$7.3)или как временный объект ($$R.12.2).

В обоих случаях такой объект не имеет имени. В следующихподразделах предполагается, что объекты относятся к классу с конструктором и деструктором. Вкачестве примера используется класс table из $$5.3.1.5.5.1 Локальные переменныеКонструктор локальной переменной вызывается каждый раз, когда при выполнении программывстречается ее описание. Деструктор локальной переменной вызывается всякий раз по выходе изблока, где она была описана. Деструкторы для локальных переменных вызываются в порядке,обратном вызову конструкторов при их создании:void f(int i){table aa;table bb;if (i>0) {table cc;// ...}// ...}Здесь aa и bb создаются (именно в таком порядке) при каждом вызове f(), а уничтожаются они привозврате из f() в обратном порядке - bb, затем aa. Если в текущем вызове f() i больше нуля, то ccсоздается после bb и уничтожается прежде него.Поскольку aa и bb - объекты класса table, присваивание aa=bb означает копирование по членам bb в aa(см.

$$2.3.8). Такая интерпретация присваивания может привести к неожиданному (и обычнонежелательному) результату, если присваиваются объекты класса, в котором определен конструктор:void h(){142Бьерн Страуструп.table t1(100);table t2 = t1;table t3(200);t3 = t2;Язык программирования С++// неприятность// неприятность}В этом примере конструктор table вызывается дважды: для t1 и t3.

Он не вызывается для t2, посколькуэтот объект инициализируется присваиванием. Тем не менее, деструктор для table вызывается трираза: для t1, t2 и t3! Далее, стандартная интерпретация присваивания - это копирование по членам,поэтому перед выходом из h() t1, t2 и t3 будут содержать указатель на массив имен, память длякоторого была выделена в свободной памяти при создании t1.

Указатель на память, выделенную длямассива имен при создании t3, будет потерян. Этих неприятностей можно избежать (см. $$1.4.2 и$$7.6).5.5.2 Статическая памятьРассмотрим такой пример:table tbl(100);void f(int i){static table tbl2(i);}int main(){f(200);// ...}Здесь конструктор, определенный в $$5.3.1, будет вызываться дважды: один раз для tbl и один раз дляtbl2. Деструктор table::~table() также будет вызван дважды: для уничтожения tbl и tbl2 по выходе изmain(). Конструкторы глобальных статических объектов в файле вызываются в том же порядке, в какомвстречаются в файле описания объектов, а деструкторы для них вызываются в обратном порядке.Конструктор локального статического объекта вызывается, когда при выполнении программы первыйраз встречается определение объекта.Традиционно выполнение main() рассматривалось как выполнение всей программы.

На самом деле, этоне так даже для С. Уже размещение статического объекта класса с конструктором и (или) деструкторомпозволяет программисту задать действия, которые будут выполняться до вызова main() и (или) повыходе из main().Вызов конструкторов и деструкторов для статических объектов играет в С++ чрезвычайно важную роль.С их помощью можно обеспечить соответствующую инициализацию и удаление структур данных,используемых в библиотеках. Рассмотрим <iostream.h>. Откуда берутся cin, cout и cerr? Когда ониинициализируются? Более существенный вопрос: поскольку для выходных потоков используютсявнутренние буфера символов, то происходит выталкивание этих буферов, но когда? Есть простой иочевидный ответ: все действия выполняются соответствующими конструкторами и деструкторами дозапуска main() и по выходе из нее (см.

$$10.5.1). Существуют альтернативы использованиюконструкторов и деструкторов для инициализации и уничтожения библиотечных структур данных, но всеони или очень специализированы, или неуклюжи, или и то и другое вместе.Если программа завершается обращение к функции exit(), то вызываются деструкторы для всехпостроенных статических объектов. Однако, если программа завершается обращением к abort(), этогоне происходит. Заметим, что exit() не завершает программу немедленно. Вызов exit() в деструктореможет привести к бесконечной рекурсии. Если нужна гарантия, что будут уничтожены как статические,так и автоматические объекты, можно воспользоваться особыми ситуациями ($$9).Иногда при разработке библиотеки бывает необходимо или просто удобно создать тип с конструктороми деструктором только для одной цели: инициализации и уничтожения объектов. Такой типиспользуется только один раз для размещения статического объекта, чтобы вызвать конструкторы идеструкторы.143Бьерн Страуструп.Язык программирования С++5.5.3 Свободная памятьРассмотрим пример:main(){table*table*deletedelete}p = new table(100);q = new table(200);p;p; // вероятно, вызовет ошибку при выполненииКонструктор table::table() будет вызываться дважды, как и деструктор table::~table().

Но это ничего незначит, т.к. в С++ не гарантируется, что деструктор будет вызываться только для объекта, созданногооперацией new. В этом примере q не уничтожается вообще, зато p уничтожается дважды! Взависимости от типа p и q программист может считать или не считать это ошибкой. То, что объект неудаляется, обычно бывает не ошибкой, а просто потерей памяти. В то же время повторное удаление p серьезная ошибка. Повторное применение delete к тому же самому указателю может привести кбесконечному циклу в подпрограмме, управляющей свободной памятью. Но в языке результатповторного удаления не определен, и он зависит от реализации.Пользователь может определить свою реализацию операций new и delete (см.

$$3.2.6 и $$6.7). Крометого, можно установить взаимодействие конструктора или деструктора с операциями new и delete (см.$$5.5.6 и $$6.7.2). Размещение массивов в свободной памяти обсуждается в $$5.5.5.5.5.4 Объекты класса как членыРассмотрим пример:class classdef {table members;int no_of_members;// ...classdef(int size);~classdef();};Цель этого определения, очевидно, в том, чтобы classdef содержал член, являющийся таблицейразмером size, но есть сложность: надо обеспечить вызов конструктора table::table() с параметром size.Это можно сделать, например, так:classdef::classdef(int size):members(size){no_of_members = size;// ...}Параметр для конструктора члена (т.е.

для table::table()) указывается в определении (но не в описании)конструктора класса, содержащего член (т.е. в определении classdef::classdef()). Конструктор для членабудет вызываться до выполнения тела того конструктора, который задает для него список параметров.Аналогично можно задать параметры для конструкторов других членов (если есть еще другие члены):class classdef {table members;table friends;int no_of_members;// ...classdef(int size);~classdef();};Списки параметров для членов отделяются друг от друга запятыми (а не двоеточиями), а список144Бьерн Страуструп.Язык программирования С++инициализаторов для членов можно задавать в произвольном порядке:classdef::classdef(int size): friends(size), members(size), no_of_members(size){// ...}Конструкторы вызываются в том порядке, в котором они заданы в описании класса.Подобные описания конструкторов существенны для типов, инициализация и присваивание которыхотличны друг от друга, иными словами, для объектов, являющихся членами класса с конструктором,для постоянных членов или для членов типа ссылки.

Характеристики

Тип файла
PDF-файл
Размер
2,87 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6505
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее