Главная » Просмотр файлов » А.В. Столяров - Введение в язык Си++

А.В. Столяров - Введение в язык Си++ (1114949), страница 8

Файл №1114949 А.В. Столяров - Введение в язык Си++ (А.В. Столяров - Введение в язык Си++) 8 страницаА.В. Столяров - Введение в язык Си++ (1114949) страница 82019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

е. на захваченный ресурс ссылаются толькозакрытые поля объекта (в примере с файлом это может означать, чтодескриптор открытого файла хранится в закрытом поле объекта). В слу­чае, если объект по тем или иным причинам прекратит существование,ресурс так и останется захваченным.Решить проблему позволяет описание в классе объекта функции-дест­руктора. Деструктор — это метод класса, вызов которого автоматическивставляется компилятором в код в любой ситуации, когда объект прекра­щает существование. Функция-деструктор имеет имя, представляющеесобой имя описываемого типа (класса или структуры), к которому спе­реди добавлен знак ~ (тильда). Список параметров функции-деструкторавсегда пуст, т.

к. в языке отсутствуют средства передачи параметров де­структору. Поскольку деструктор играет специальную роль и в явномвиде не вызывается, тип возвращаемого значения для деструктора такжене указывается (деструктор никогда не возвращает никаких значений).Проиллюстрируем понятие деструктора на примере класса F ile , ин­капсулирующего дескриптор файла.c la s s F ile {in t fd ; / / Дескриптор. -1 означает, что файла нетp u b lic :F ile O { fd = -1 ; }/ / Конструктор устанавливает отсутствие файлаbool OpenEO(const char *name) {fd = open(name, 0_ED0NLY);return (fd != - 1 );}/ / метод пытается открыть файл на чтение,/ / возвращает tru e в случае успеха,/ / f a ls e в случае неудачии .../ / .

. . методы работы с файлом . . .И ...~ F ile () { i f ( f d !=—1) c lo s e ( f d ) ; }34/ / Д еструктор закр ы вает ф айл, если он открытДеструктор будет вызван в любой ситуации, когда объект типа F ileпрекращает существование. Например, если объект был описан как ло­кальный в функции, то при возврате из функции (в том числе и досроч­ном вызове оператора return) для этого объекта отработает деструктор.Вообще, при создании объекта ровно один р а з отр абаты ваеткон структор, при уничтожении о бъекта ровно один р аз отр аба­ты вает деструктор.§2.10. О перации работы с ди н ам ическойп ам ятьюИзвестно, что язык Си сам по себе не включает средств работы сдинамической памятью; создание и уничтожение динамических струк­тур данных вынесено в библиотеку и производится обычно с помощьюфункций m allocQ , r e a llo c () и fre e Q .

В языке С и + + одновременнос выделением и освобождением памяти в некоторых случаях, а именно,при создании и удалении объекта типа структуры или класса, имеющегоконструкторы и/или деструкторы, необходимо выполнять дополнитель­ные действия, заданные этими конструкторами и деструкторами.

Кро­ме того, при создании динамических объектов с помощью конструктораиного, нежели конструктор по умолчанию, необходима возможность ука­зания параметров конструктора. Функции m allocQ и fre e Q ничего незнают о конструкторах, деструкторах и параметрах, поэтому для созда­ния и удаления объектов они непригодны. Более того, информацией оконструкторах и деструкторах обладает только компилятор, поэтому вязыке Си-|—Ь вообще невозможно вынести работу с динамической памя­тью из языка в библиотеку без введения дополнительных средств.

Авторязыка С и + + Бьёрн Страуструп решил пойти более простым путем ивнёс в язык соответствующие синтаксические конструкции для созданияи удаления объектов.Для создания в динамической памяти одиночного объекта (перемен­ной произвольного типа) в языке С и + + используется операция new, ар­гументом которой является имя типа создаваемого объекта. Например:in t * р ;р = new i n t ;Если создаваемый объект принадлежит типу, имеющему конструктор, ивозникает необходимость передать конструктору параметры, то эти па­раметры указываются в скобках после имени типа.

Так, создание объекта35описанного ранее типа Complex (см. § 2.1.5) с указанием действительнойи мнимой частей может выглядеть так:Complex * р ;р = new Complex(2 .4 , 7 .1 2 );Для удаления используется операция d elete:d e le te р;Для создания и удаления динамических массивов используются спе­циальные век то р н ы е формы операций new и d elete , синтаксическиотличающиеся наличием квадратных скобок:in t *р = new i n t [200]; / / массив из 200 целых чиселd e le te [] р;/ / удаление массиваЭти формы отличаются тем, что соответствующий конструктор и де­структор вызываются для к аж д о го э л е м е н т а м ас си в а.Необходимо отметить, что векторная форма операции new не имеетсинтаксических средств для передачи параметров конструкторам, поэто­му для создания массива элементов типа класс или структура необходи­м о наличие у э т о г о т и п а к о н с т р у к т о р а по умолчанию (см.§ 2.4).Важно знать, что объекты в динамической памяти, созданные с помо­щью векторной формы операции new, нельзя удалять с помощью обыч­ной формы операции d elete и наоборот.

Дело в том, что реализацияменеджера динамической памяти вправе выделять память под обычныепеременные и под массивы из разных областей динамической памяти,имеющих, возможно, различную организацию служебных структур дан­ных.Также не следует удалять с помощью d elete объекты, созданныефункцией m allocQ , и наоборот, не следует удалять обекты, созданныеоперациями new, с помощью fre e Q . Всё это может привести к непред­сказуемым последствиям.§2.11.

К о н стр у к то р коп и рован и яРассмотрим следующую ситуацию. В реализации некоторого класса(назовем его C lsl) нам потребовался динамический массив, который мысоздаем в теле конструктора класса; естественно, в деструктор следуетпоместить оператор для уничтожения этого массива.c la s s C ls l {in t * р ;p u b lic :36C lslQ { p = new in t[2 0 ]; }~ C lsl() { d e le te [] p; }II . . .Теперь предположим, что кто-то создает в программе копию объектакласса C lsl. Такое может произойти, например, если объект окажетсяпередан по значению в качестве параметра функции.

Например:void f ( C l s l х) {II . . .}in t main() {и ...C lsl с;f (с) ;//...}Проанализируем происходящее со структурами данных при вызовефункции f (). Локальная переменная х является копией объекта с. Копиялюбого объекта данных создается путем обычного побитового копирова­ния, если не указать иного. Следовательно, при копировании объектакласса C lsl скопирован окажется указатель на динамический массив;иначе говоря, у нас появятся два объекта, использующие один и тот жеэкземпляр динамического массива: оригинал объекта с и его локальнаякопия х.

Возникшая ситуация показана на рис. 2.1.Рис. 2.1. Схема структуры данных после побитового копирования объек­таДаже если такое разделение не приведет к немедленным ошибкам(например, функция f () может изменить объект х, что отразится навнутреннем состоянии объекта с, чего мы могли и не ожидать), в любомслучае при выходе из функции f () отработает деструктор (для объектах), который уничтожит динамический массив, в результате чего объект сокажется в заведомо ошибочном состоянии, поскольку будет содержатьуказатель на уничтоженный массив.

К возникновению ошибки теперь37приведёт любое действие с объектом с, если же никаких действий непредпринимать, то ошибка возникнет при уничтожении объекта (когдадеструктор попытается вновь уничтожить уже уничтоженный массив).Очевидно, что побитовое копирование нас не устраивает и необходимопроинструктировать компилятор о том, каким именно способом можнокорректно скопировать объект класса C lsl. В языке С и + + для такихслучаев предусмотрен специальный случай конструктора, называемыйк о н с т р у к т о р о м копирования.Конструктор копирования — это конструктор, имеющий ровно одинпараметр, причем тип этого параметра представляет собой ссылку наобъект данного (описываемого) класса; в большинстве случаев эту ссыл­ку снабжают модификатором const, чтобы показать, что при созданиикопии исходный объект не изменится.

Конструктор копирования пред­ставляет собой инструкцию компилятору относительно того, как ско­пировать объект данного типа, или, иначе говоря, как создать объектданного типа, уже имея один такой объект. Снабдим конструктором ко­пирования наш класс C lsl:c la s s C ls l {in t * p ;p u b lic :C lslQ { p = new in t [20]; }C lsl(c o n st Clsl& a) {p = new i n t [20];f o r ( in t i= 0 ; i<20; i++) p [ i] = a . p [ i ] ;}~ C lsl() { d e le te [] p; }II ...>;Теперь ситуация при вызове функции f () будет выглядеть так, как по­казано на рис. 2.2.Рис.

2.2. Схема структуры данных после применения конструктора ко­пирования38§2.12. В рем енны е и аноним ны е объектыС анонимными и временными объектами мы уже встречались ранее(см. §2.1.3, стр. 16; §2.5, стр. 27). Анонимные объекты обычно применя­ются в случае, когда объект создаётся, чтобы быть использованным лишьодин раз; как правило, в такой ситуации давать объекту имя не хочется,к тому же код с использованием анонимного объекта оказывается болеелаконичным и наглядным.

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

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

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

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