Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 65

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

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

Часто зто приводит и к более эффективному коду. Например: с1азз Реглан ( ззг(ие нате; ззг(ия аддгезз; /У ... Реглан (соиле Регзопз ); Реглан (соизгззгтеь и, соил/ ззппяь а) )' Регзон::Реглан (сонм зивпяа и, соим ззпиеь а) : нате(и) ( адаем = а; ) Здесь нате инициализируется копией и. А член аИИгезз сначала инициализируется пустой строкой, а затем ему присваивается значение а. 10.4.6.2. Члены-константы с1ам Сипоиз ( риы(с: МаИс сонМ 1из с1 = 7; МаИс 1из сг = Ы; сопле (пз сЗ = 15; маИс сопл( 1нз с4ъб(17) г ззаз(с соиле)тоаз с5 = 7.

Рп // ... )' Р о/с но нужно полнить определение /У еггоп не константа У еггоп нет модификатора з(або // еггог: не константный инициализатор //еггоп не интегральный тип Если (и только если) требуется инициализированный член хранить и использовать как объект в памяти, то его тле-либо нужно уникально определить. Иницнализатор при атом повторять нельзя: сопи (из Сипоиз:: с1; // обязательно (но без повтора инициализатора) соим (пз* р = ьСипоиз:: с1;,У орк Сипоиз те! был определен В качестве альтернативы, в классе можно определить символические константы с помощью перечислений (84.8, 8)4.4.6, 8!5.3). Например: с1азз Х ( епит (с1= 7, с2=11, с3=15, с4=17); Статические члены-константы интегральных типов можно инициализировать с помощью константных выражений прямо в их объявлениях.

Например: 10.4. Объекты Тогда у вас не будет возникать искушение инициализировать в классе переменные, числа с плавающей запятой и т.д. 10.4.6.3. Копирование членов Умолчательный копирующий конструктор и умолчательный вариант операции присваивания (510.4.4.1) просто копируют все элементы класса. Когда такое копирование не проходит, при попытке копирования объектов класса возникает ошибка.

Например: с!азз !)п!цие Лапа!е ( рпка1е: УУ копирующие операции здесь рпаате для предотвращения явного УУ копирования Д!!.2.2! ()плие Ьапз(!е (сопл! (!парие йапз)!еь); бийские йап4!еь орегагог= (сопл! (Уп!згие ЬапЖеь) риб!гс: У... )з зпис! у 1 уу... (Уп(згие Ьапй!е аз г7 требуется явная инициализация )' уу1; ууг =у!з У еггою нельзя скопировать У::а Кроме того, умолчательный вариант присваивания не проходит в тех случаях, когда нестатические члены являются ссылками, константами или имеют пользовательский тип, не определяющий умолчательного варианта операции присваивания. Обратите внимание, что в результате работы умолчательного копирующего конструктора члены-ссылки в обоих объектах (оригинальном и копии) ссылаются на один и тот же объект в памяти, что порождает проблемы при уничтожении этого объекта.

При написании копируюшего конструктора нужно проследить за тем, чтобы были скопированы все элементы, для которых действительно требуется копирование. Иначе онн проинициализируются умолчательнымн значениями, а это часто не то, что требуется. Например; Регзоп:: Регзоп )сопки Регзопь а): нагие (а. пате) 1 ) УУ будьте внимательны.' Здесь я забыл скопировать азЫгезз, и по умолчанию азЫгезз проинициализируется пустой строкой.

При добавлении нового члена к классу всегда тшательно проверяйте, не нужно ли при этом модифицировать ранее определенные в классе конструкторы для инициализации и копирования нового члена. 314 Глава 10. Классы 10.4.7. Массивы Если объект класса можно создать без указания явного инициализатора, то можно определить массив элементов этого класса. Например: ТаЫе 1Ы [10]; Создается массив из 10 злемелтоа типа Та01е, и каждый элемент инициализируется вызовом ТаЫе:: ТаЫе () с умолчательным аргументом 15. За исключением применения списка инициализации (85.2.1, 818.б.7) не существует иных способов явного задания аргументов конструктора в объявлении массива.

Если в обязательном порядке требуется инициализировать элементы массива разными значениями, нужно написать соответствующий умолчательный конструктор, который так или иначе вырабатывает необходимые значения. Например: сгавв 1Ьи)/ег ( вэг]ля Ьиу; иоЫ1'() ( 1ЬиЯег негде[100]; //... // каждое слово иииииалиэируетсл иэ сга Таких хитростей, все же, лучше избегать. Когда массив уничтожается, деструктор вызывается для каждого элемента массива. Это происходит неявным образом для массивов, память под которые не выделялась операцией леис Как и язык С, язык С++ не отличает указатель на массив от указателя на первый элемент массива (85.3).

Как следствие, программист должен явно указать, что удаляется — массив или отдельный элемент. Например: иоЫ1'(1лэ ве) ( ТаЫе* 11 = леи ТаЫе; Тайе* 11 = лен Тайе [т]; ТаЫе" 13 = иеи Тайе; ТаЫе* 14 = иею ТаЫе [ве); Точные детали вьшеления памяти под массивы или под отдельные объекты зависят от конкретной реализации. Поэтому и реакция на ошибочное применение операций Ие!еге или Фе1еге [] будет также различаться.

В простейших и неинтересных случаях типа приведенного выше примера компилятор в состоянии обнару- риЬНс: 1ЬиЯег() (с(и»Ьи3; ) // ... ); Фе1еэе 0; де1еге [] (2( Ие1е1е [] 13; де1еэе (4; ) // правильно // лравильио // нелравильно // иеиравильио 10.4. Объекты жить потенциальные проблемы, но в общем случае нечто ужасное произойдет лишь во время выполнения программы. С логической точки зрения нет необходимости в особой форме операции гге1еге (), предназначенной специально для массивов. С другой стороны, представим, что мы потребовали от системы управления свободной памятью маркировать выделяемые блоки памяти таким образом, чтобы сразу было ясно, происходило это вьшеление для массивов илн нет. С программиста при этом будет снята дополнительная ноша, однако она тяжелым грузом ляжет на приложения и снизит эффективность их выполнения. Если же вы находите массивы в С-стнле громоздкими и неуклюжими, используйте вместо них некоторый подходящий класс, например гесгог (53.7.), 5!6.3): юЫ0() ( гесгог<ТаЫе> г (10); УУ нет необходимости в удалении юсгог<ТаЫе>* р = пеи гесгог<ТаЫе> (1О); УУ используйте г(е!еге, а не де(егеД Ие1еге рг ) Применять контейнеры типа нес(ог намного проще, чем то н дело манипулировать операциями ае)г/г1е1еге.

Кроме того, класс иесеог обеспечивает безопасное поведение в плане исключений (приложение Е). 10.4.8. Локальные статические объекты Конструктор для локального статического объекта Я7.Е2) вызывается только тогда, когда поток управления в работающей программе первый раз проходит через определение объекта. Рассмотрим пример: юг'( 1нг 1) ( мане ТаЫе 101; уу ... (7'( 1) ( вганс ТаЫе гЫг; уу ... ) ) Ыг гна(н () ( 1'(О) г 1'(1); 1(г); уу ... ) Здесь конструктор для гЫ вызывается только при первом вызове функции 1() .

Так как переменная гЫ объявлена статической, она не уничтожается при выходе из 1(), и она повторно не конструируется при повторных вызовах 1() . Поскольку блок кода, содержащий определение 1Ы2, не выполняется при вызове 1'(О), то гЫ2 не соз- Глава 10. Классы Э1б дается до вызова!(1) . При повторных входах в этот блок, имеющих место при последующих вызовах Т(), гб12 повторно не конструируется. При завершении работы программы деструкторы локальных статических объектов вызываются в порядке, обратном порядку их конструирования (59.4.!.1). Однако точный момент их вызова не спецнфицируется. 10.4.9.

Нелокальные объекты Переменная, определяемая вне функций (в глобальном пространстве, в пространстве имен или классовая статачесаая переменная; 5С.9), инициализируется (конструируется) до вызова функции тай (), а их деструкторы вызываются после завершения работы функции таси () . Динамическая компоновка программных модулей слегка усложняет картину, откладывая инициализацию до того момента, когда код будет динамически скомпонован с исполняемой программой.

Конструкторы нелокальных объектов в рамках единицы трансляции исполняются в порядке, в каком появляются их определения. Рассмотрим пример: с1ат Х ( У... его!!с тайе тетгъ(г ТаЫе (Ы; ТаЫе Х:: темпы; аатеерасе Я ( Таые ты2; ) Здесь порядок создания объектов следующий: сначала гЫ, затем Х:: тетгЫ, а затем У:: гЫ2.

Заметьте, что объявления (в противоположность определениям), например объявление агетгЫ в Х, не влияют на порядок создания объектов. Деструкторы объектов вызываются в обратном порядке: сначала для объекта Я:: Ф!2, затем для Х:: тетгЫ, и потом для гЫ. Нет никаких правил для порядка конструирования нелокальных объектов, определенных в разных единицах трансляции. Например: У файл Г)1е!.с: ТаЫе (Ы1; У файл 1)!е2,с: ТаЫе (Ы2; Что создается раньше, гЫ1 или гЫ2, зависит от конкретной реализации. Даже в рамках одной и той же реализации нельзя точно специфицировать порядок их создания. Динамическая компоновка, или даже небольшие вариации в процессе компиляции способны изменить этот порядок. Аналогично, порядок уничтожения объектов также зависит от реализации.

При создании библиотеки часто бывает необходимо или просто удобно ввести тип, единственной целью которого является выполнение инициализации и завершающей очистки (с1еапцр). Такой тип предполагается использовать один раз при 10.4. Объекты 31г создании статического объекта, чтобы обеспечить вызовы конструктора и деструк- тора. Вот пример на эту тему: с1азз У11Ь 1пи ( л11Ь пггг[); -У11Ь гпй(); )' // готовит о[!Ь к использованию У очищает ресурсы после использования Х1(Ь с1азз У11Ь ( з!аас 26Ь !Ыг хг У... ): К сожалению, нет гарантии, что этот статический объект будет проинициализирован до его первого использования и уничтожен после последнего, если программа состоит из нескольких раздельно компилируемых единиц.

Конкретная реализация может предоставить такую гарантию, но в общем случае такой гарантии нет. Программист можем сам обеспечить такую гарантию с помощью стратегии, обычно применяемой к локальным статическим объектам: стратегии флага первого использования. Например: с1азз У11Ь ( зеайс Ьоо[ 1Л1!ш1!гег[ г згаас гоЫ ш[г(а1(ге() (1пйа1[геа' = !гие; ) риЫ/с: // конструктор отсутствует го[а /'( ) ( гу(ш[йа1[гег1 ==)а!зе) [пгг[адге() ) // ...

// ... 1п!ь оЬ/'() [в!або 1пгх = О; ге!ига х; ) //инициализация по первому вызову Флаги первого использования не решают абсолютно всех проблем. Например, речь может пойти об объектах, которые ссылаются друг на друга во время конструирования. Конечно, таких ситуаций лучше избегать, но если все же они необходимы, Если многие функции потребуют проверки флага первого использования, то стратегия станет утомительной, но все же по-прежнему работоспособной.

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

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

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

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