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

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

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

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

Ь вЂ” или в качестве альтернативы — мы могли бы установить связь явно, поместив объявления функций поддержки в одно пространство имен с объявлением класса Я8.2): <У средства для работы ео временем патеврасе СЬгопо ( е1авв Ра<е ( l* ... *l ) < <п< д((! (Ваге а, Ваге Ь): Ьоо1 <еаруеаг (<и< у) < Ваге пех«вее«дау (Ра<е <0 ) Ва<е пех< ва<иг«ау (Ра<е <0; У... ) В типичных случаях пространство имен Сйгопо содержало бы еше и другие логически связанные классы, например, ли«е и о<ар<во<ей, а также их собственные функции поддержки.

Применение пространства имен лишь для одного класса является избыточным и ведет к напрасному переусложнению. 10.3. Эффективные пользовательские типы 303 10.3.3. Перегруженные операции Полезно добавить к классу функции, обеспечивающие возможность пользовательскому коду применять привычные формы записи. Например, функция орегасог== () определяет„как операция == (операция сравнения на равенство) работает для обьектов класса Васе: сп!те Ьоо! орегасог== (Расе а, Расе Ь) ( гетгп а.йау() ==Ь.с!ау() Ьй а.топей () ==Ь.тоней () Ьй а.уеаг() ==Ь.уеаг() //проверка на равенство Другими очевидными кандидатами являются: Ьоо! орега<ог! = (Роте, Вате) 1 Ьоо! орегасог< (Расе, Расе); Ьоо! орегасог> (Васе, Расе); // ...

Васей орегасогь+ (Ратей сс) 1 Ратей орегатг-- (Васей Ы) 1 // не равно //меньше чем // болыие чем //увеличить Расе на один день //уменьшить Расе на один день Ратей орегатог+= (Ратей с(, тс и) 1 Вше ь орегасог-= (Расе ь с(, (т и ) 1 // прибавить и дней /вычесть и дней Васе орегасогь (Расе а, тс и) 1 Ва1е орегатог- (Васе сг, спг и) 1 /' прибавить п дней //вычесть и дней овтгеатй орегатог«(онгеатй, Ва1е сг); //вывести а' аоеатй орегасог» ((всгеать, Расеь И) 1 /считат~ Ы Для класса Васе перегрузка этих операций совершается исключительно ради дополнительного удобства.

Но для таких типов, как комплексные числа 611.3), вектора (83.7.1) и классы функторов (функциональных объектов или объектов-функций) (818.4) — стандартные операции настолько проникли в сознание, что их перегрузка является просто обязательной. Перегрузка операций подробно рассматривается в главе 11. 10.3.4. Роль конкретных классов Я называю простые типы, определяемые пользователем, такие как Васе, конкретными типами (сопсгесе Сурев), чтобы противопоставить их абстрактным классам (оде!гас! с(оьвес) (82.5.4) и классовым иерархиям 612.3), а также подчеркнуть их сходство со встроенными типами, такими как !пс нли айаг. Конкретные типы называют также типами-значениями (уа!ие !урез), а их применение в программе — программированием, ориентированным на значения (ча1це-опеп(ес) рго8гаппшп8). Модель их применения и философия, стоящая за проектированием таких типов, сильно отличаются от того, что принято называть объектно-ориентированным программированием ($2.6.2).

Конкретные типы предназначены для того, чтобы хорошо и эффективно выполнять отдельную небольшую работу. Как правило, пользователю не предоставляют возможностей для модификации поведения конкретных типов. В частности, конкретные типы не предназначаются для демонстрации полиморфного поведения (см. 52.5.5, 512.2.6), 304 Глава ) О. Классы Если вам не подходят отдельные черты конкретного типа, вы строите новый тип с желаемым поведением. При этом вы можете повторно применить старый конкретный тип (гецае а сопсгеге )уре) в качестве строительного кирпичика нового типа точно так же, как и встроенный тип, такой как 1иг. Например: агат Ваге апй 11те ( рг1»аге: Васе А Т1те 1; риЫ)с: Ва1е аиа Ите (Ва<е а, Т1те 1); Ваге аи«1 ите((пг Ф, Ваге::Молей т, гигу, Т)тес) 1 У...

): Механизм наследования классов, обсуждаемый в главе ) 2, может быть применен с целью формулирования различий (и сходства) нового типа и заданного конкретного типа. Определение типа Рее из типа геегог (53.7.2) служит соответствукнцим примером. При наличии качественного компилятора конкретные типы вроде Ваге не вносят дополнительных накладных расходов ни в плане скорости выполнения, ни в плане объема занимаемой памяти. Размер конкретного типа известен во время компиляции, так что объекты этих типов можно создавать в стеке (то есть без операций размещения в свободной памяти). Раскладка объектов этих типов известна во время компиляции, так что не составляет труда реализовывать встраиваемые операции.

Аналогично, совместимость с языками типа С или Ропгап достигается без дополнительных усилий. Хороший набор конкретных типов может составить надежный фундамент приложения. Отсутствие маленьких эффективных типов ведет к перерасходу компьютерной памяти и вычислительных мощностей из-за применения слишком общих и громоздких классов. Кроме того, отсутствие конкретных типов приводит к снижению эффективности труда программиста, поскольку каждый программист вынужден в очередной раз писать свой собственный код для манипулирования «простыми и широко применяемыми» структурами данных.

10.4. Объекты Объекты можно создавать разными способами. Некоторые объекты являются локальными переменными, некоторые — глобальными переменными, другие входят в состав более крупных объектов иных классов (являются членами классов) и т.д. В настоящем разделе обсуждаются перечисленные альтернативы, правила, которыми при этом руководствуются, как конструкторы используются для инициализации объектов, и как деструкторы очищают выделенные под объекты ресурсы перед тем, как объекты станут недоступными.

) 0.4. Объекты 305 10.4.1. Деструкторы с!аее Хате ( саик! сйаг* т У... ): с!ат ТаЫе ( Мате* р; Ыее гт; риЬНс: ТаЫе(к!се ! е = 15) (р = иев Мате [т = е] ! ) -ТаЫе() (де!ее(] р; ) ~У конструктор !! деструктор Мате* 1оояир (саик! слаг*) Ьоо1 !иеегг (Хате*); Тильда в имени деструктора -ТаЫе() является знаком операции дополнения, что намекает на характер этой функции, дополняющей классовый конструктор ТаЫе() . Комплиментарные пары конструктор/деструктор служат обычным для языка С++ механизмом реализации объектов переменного размера.

Контейнеры стандартной библиотеки, такие как тар, применяют некоторые вариации этой техники для управления выделением памяти под элементы, так что последуюгцее обсуждение иллюстрирует технику, которой вы фактически пользуетесь всегда, когда используете стандартные контейнеры (и стандартный тип егг!и» в том числе). Это обсуждение в равной степени распространяется и на типы без явно запрограммиро- Конструкторы предназначены для инициализации объектов. Можно сказать, они создают среду, в которой затем выполняются функции-члены. Иногда создание такой среды включает вьщеление таких ресурсов, как файлы, блокировки или память, и которые должны быть освобождены после использования объектов класса (Э]4.4.7). Таким образом, эти классы нуждаются в функции, которая гарантированно вызывается при уничтожении объектов аналогично тому, как конструктор гарантированно вызывается при их создании.

Такие функции принято называть деструкторами (с(ез!гас!огз). Их типичное поведение заключается в очистке и/или освобождении ресурсов. Деструкторы автоматически вызываются, когда локальные переменные выходят из области видимости, или когда явным образом уничтожаются объекты, динамически созданные в свободной памяти. Только в крайне необычных ситуациях от пользователя требуется вызывать деструкторы явно (э10.4.11).

Чаше всего деструкторы освобождают память, динамически вьщеленную конструкторами. Рассмотрим простую таблицу элементов некоторого типа Хате. Конструктор класса ТаЫе должен выделить память под элементы таблицы. Когда таблицу тем или иным способом уничтожают, мы должны быть уверены в том, что ранее выделенная в конструкторе память возвращена системе с целью ее дальнейшего повторного использования. Это можно сделать, предоставив специальную, комплиментарную к конструктору функцию: Глава ) О.

Классы 306 ванных деструкторов, ибо в этом случае можно предполагать, что деструктор про- сто ничего не делает. 10.4.2. Конструкторы по умолчанию Аналогично, можно считать, что большинство типов имеют конструктор по умолчанию. Конструктор по умолчанию можно вызывать, не предоставляя никаких аргументов. В вышеприведенном примере из-за наличия умолчательного значения 15 для аргумента конструктора ТаЫе:: ТаЫе (л1ее 1), его можно считать конструктором по умолчанию.

Если пользователь явным образом определяет в классе конструктор по умолчанию, именно этот вариант и задействуется; в противном случае компилятор пытается сгенерирвать свой вариант умолчательного конструктора, но только в случаях, когда отсутствуют явно определенные в классе конструкторы иных типов. Сгенерированный компилятором конструктор по умолчанию пытается неявно вызывать умолчательные конструкторы для членов класса (также имеющими тип классов) и конструкторы базовых классов (812.2.2). Например: л1~ исг ТаЫел ( гпг П (пг И[10]; ТаЫе 11) ТаЫе и (10); )г ТаЫел и; Здесь и будет инициализироваться сгенерированным конструктором по умолчанию, который вызовет ТаЫе (15) для гг. 11 и каждого элемента и. кс С другой стороны, п.1 и элементы и. Ы не относятся к классовым типам и, соответственно, не инициализируются.

Причины такого расхождения заключаются в необходимости обратной совместимости с языком С и опасении излишних накладных расходов для встроенных типов данных. Из-за того, что константы и ссылки обязаны инициализироваться (85.5, 85.4), класс, содержащий члены, являющиеся константами или ссьиками, не может конструнроваться по умолчанию, если только программист не предоставит явным образом соответствующий конструктор (810.4.6.1). Например: лееисг Х ( сопле (пг а; соим 1пгв ег Хк; ~У елкою нет умолчотелнного конструктора для Х Конструкторы по умолчанию можно вызвать явно (810.4.10).

Встроенные типы также обладают конструкторами по умолчанию (86.2.8). ) 0.4. Объекты 307 10.4.3. Конструирование и уничтожение объектов Рассмотрим различные способы создания и последующего уничтожения объектов классов. Объект может быть создан в качестве: ° 810.4.4. Именованного автоматического объекта, создаваемого каждый раз при проходе потока управления работаюгцей программы через его определение, и уничтожаемого по выходу из блока, содержащего указанное определение. ° 810.4.5. Объекта в свободной памяти, создаваемого операцией ие)г и уничтожаемого операцией Ие1еге.

° 810.4.6. Нестатического члена классового типа, создаваемого в виде подобьекта в момент создания объемлющего объекта иного типа, и уничтожаемого в момент уничтожения указанного объемлющего объекта. ° 810.4.7. Элемента массива, создаваемого и уничтожаемого в моменты создания и уничтожения самого массива. ° 810.4.8. Локального статического объекта, создаваемого в момент первого прохождения потока управления работающей программы через его определение, и уничтожаемого в момент окончания работы программы. ° 810.4.9. Глобального объекта, объекта из пространства имен или статического объекта класса, создаваемого при старте программы и уничтожаемого при завершении работы программы.

° 810.4.10. Временного объекта, создаваемого в процессе вычисления выражения, и уничтожаемого после окончания вычисления полного выражения. ° 810.4.11. Объекта, помешаемого в область памяти, предоставляемую функцией пользователя, с учетом параметров, передаваемых конструктору операцией размещения (р!асетепг пе)г ). ° 810.4.12. Члена объединения (алгол), который не может иметь ни конструктора, ни деструктора.

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

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

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

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