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

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

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

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

Наряду с многи­ми другими операциями, операция -> переопределяется исключительнометодами класса или структуры, то есть не может быть переопределенаотдельной функцией. Чтобы избежать рутинной работы по переопреде­лению отдельных операций для выборки каждого поля, в С и + + принятонеочевидное, но вполне работающее соглашение: операция -> определя­ется методом operator-> (), не имеющим параметров (как и обычныеунарные операции), но при этом метод обязан возвращать либо указа­тель на некую другую структуру или класс, либо объект (или ссылкупа объект), для которого, в свою очередь, операция -> переопределе­на как метод. При использовании перегруженной операции -> компи­лятор вставляет в код последовательно вызовы методов operator-> (),пока очередной метод не окажется возвращающим обычный указательна структуру или класс; именно по этому указателю и производится витоге выборка заданного поля.Попробуем проиллюстрировать сказанное на примере.

Пусть у насесть структура s i и нам необходим класс, объекты которого будут ве­сти себя как указатели на s i, но при уничтожении такого «указателя»(например, при завершении функции, в которой он описан как локаль­ная переменная) объект, на который он указывает, будет уничтожаться.Начнём описание класса:c la s s P o in ter_ sl {s i *р ;p u b lic :Будем предполагать, что хранящийся внутри объекта простой указательна s i может иметь и нулевое значение, что будем расценивать обычнымобразом как отсутствие объекта; естественно, в этом случае удалять ни­чего не будем.

Опишем теперь конструктор и деструктор:P o in te r _ s l(sl *p tr = 0 ) { р = p tr ; }~ P o in te r_ sl() { i f (р) d e le te р; }Для удобства работы введём операцию присваивания обычного адреса:s i * o p e ra to r= (sl *p tr ) {i f (р) d elete p;58Р = p tr;}Заметим, что копирование и присваивание объектов класса P o in ter_slзаведомо приведёт к ошибкам, так как один и тот же объект типа s i вэтих случаях будет удаляться дважды.

В связи с этим запретим присва­ивание и копирование объектов класса P o in ter_ sl, убрав конструкторкопирования и соответствующий оператор присваивания в приватнуючасть:p r iv a te :P o in te r_ sl(co n st Pointer_sl& ) -Q/ / copying prohibitedvoid operator=(const Pointer_sl& ) -Q/ / assignments prohibitedНаконец, опишем операции, которые превратят объекты нашего класса вподобие указателя на s i, а именно, операции разыменования (унарную *)и выборки поля (->), и завершим описание класса:p u b lic :sl& o p e ra to r*() { return *р ; }s i * o p erator->() { return p; }>;Такой класс удобно использовать, например, внутри функций.

Так, еслив начале некоторой функции описать объект класса P o in ter_ sl, то емуможно будет присваивать адреса новых экземпляров s i , при этом онбудет каждый раз удалять старый экземпляр, а когда работа функциизавершится, автоматически удалит последний из экземпляров s i:in t f () {P o in ter_sl р;р = new s i ;р->а = 25;p->b = р->а + 36;И .../ / при завершении f память будет освобождена}§2.19.5.

Переопределение операции вы зова функцииОперация вызова функции, синтаксически представляющая собойпостфиксную операцию, символом которой служат круглые скобки (воз­можно, содержащие список параметров), может быть, как и другие опе­рации, переопределена. Поскольку вызов функции обозначается круглы­ми скобками, имя функции, которая переопределяет эту операцию, будет59состоять из слова operator и круглых скобок; как обычно, после именифункции записывается список формальных параметров. Например, опе­рация вызова функции без параметров записывается так:void o p erato rQ Q { / * тело * / }Подобно операциям присваивания и индексирования, вызов функции пе­реопределяется только методом класса.Приведём пример.

Опишем класс Fun, для которого переопределеныоперации вызова функции без параметров, а также с одним и двумя це­лочисленными параметрами:c la s s Fun {p u b lic :void o p eratorQ Q{ p rin tf("fu n O \n "); }void o p e rato r( ) (in t a){ p r in t f ( " f u n l: %d\n", a ) ; }void o p e rato r( ) (in t a, in t b){ p rin tf("fu n 2 : %d %d\n", a , b ) ; }>;Теперь мы можем написать следующий фрагмент кода:Fun f ;f О ; f (100); f (25, 36);В результате выполнения этого фрагмента будет напечатано:funOfu n l: 100fun2: 25 36§ 2.19.6. Переопределение операции преобразованиятипаРассмотрим следующий фрагмент кода:in t i ;double d;// ...i = d;В строчке, содержащей присваивание, задействована (неявно) опера­ция преобразования т и п а в ы р а ж е н и я , позволяющая в данном слу­чае построить значение типа in t на основе имеющегося значения ти­па double.

Аналогичную возможность неявного преобразования можно60предусмотреть и для классов, введённых программистом. Один из спосо­бов этого мы уже знаем — это конструктор преобразования (см. § 2.11).В некоторых случаях применить конструктор преобразования не уда­ётся. В частности, конструктором можно задать преобразование из ба­зового типа в тип, описанный пользователем, но не наоборот. Кроме то­го, иногда бывает по каким-то причинам невозможно изменить описаниенекоторого класса, но в программе нужно преобразование в объекты это­го класса. Бывают и другие (довольно экзотические) ситуации, когда мыне можем задать способ преобразования путём модификации того типа,к квторому производится преобразование, но при этом у нас есть воз­можность изменить (дополнить) описание того типа, значения которогоподлежат преобразованию.

В таких случаях применяют переопределениеоперации преобразования типа.Операция неявного преобразования типов определяется методом, имякоторого состоит из слова operator и имени типа, к которому необходи­мо преобразовывать тип выражения. Тип возвращаемого значения длятакой функции не указывается, так как он определяется именем. Напри­мер:c la s s А {I I ...p u b lic :И ...operator in t( ) { / * . . . * / }};Наличие в классе А операции преобразования к in t делает возможным,например, такой код:А а;in t х;И ...х = а;Естественно, операция преобразования может быть переопределена толь­ко как метод класса или структуры.Учтите, что чрезмерное увлечение переопределениями операции пре­образования приводит, как правило, к тому, что компилятор находитбольше одного способа преобразования из одного типа к другому и врезультате не применяет ни одного из них, выдавая ошибку.

Поэтому напрактике переопределение операции преобразования типа используетсякрайне редко; для получения значений нужного типа из объектов классовили структур обычно применяют специально для этого вводимые мето­ды (обыкновенные, без слова operator), вызываемые явно. Пример си­61туации, когда операция преобразования типа оказывается действительнонужна, рассмотрен в § 2.20.§2.20.

П рим ер: р азр еж ен н ы й м ассивПод р а зр е ж е н н ы м м асси во м понимается массив относительнобольшого объёма (например, состоящий из нескольких миллионов эле­ментов), большинство элементов которого равны одному и тому же зна­чению (чаще всего нулю) и лишь некоторые элементы, количество кото­рых ничтожно в сравнении с размером массива, от этого значения отли­чаются. Естественно, в такой ситуации целесообразно хранить в памятилишь те элементы массива, значения которых отличны от нуля (или дру­гого значения, которому равно большинство элементов).Попробуем написать на С и + + такой класс, который ведёт себя как це­лочисленный массив потенциально бесконечного размера9 в том смысле,что к объекту этого класса применима операция индексирования (квад­ратные скобки), однако объект реально хранит только те элементы, зна­чения которых отличаются от нуля.

Назовём этот класс SparseA rraylnt.Для простоты картины будем считать, что количество ненулевых эле­ментов массива настолько незначительно, что даже линейный поиск сре­ди них может нас устроить по быстродействию. Это позволит хранитьненулевые элементы массива в виде списка пар «индекс/значение». Вседетали реализации, включая и структуру, представляющую звено спис­ка, скроем в приватной части класса. Это позволит при необходимостисменить реализацию на более сложную.Основная проблема при реализации разреженного массива возникаетв связи с поведением операции индексирования.

Дело в том, что вы­ражение «элемент массива» может встречаться как в правой, так и влевой части присваиваний, и в обоих случаях используется одна и таже функция-метод класса SparseA rraylnt, называемая operator [] . Ес­ли бы все элементы массива хранились в памяти (как это было в примереиз §2.19.2), можно было бы просто возвратить ссылку на соответствую­щее место в памяти, где хранится элемент, соответствующий заданномуиндексу.

С разреженным массивом так действовать не получится, по­скольку в большинстве случаев элемент в памяти не хранится. Однакоже просто возвратить нулевое значение (без всякой ссылки) нельзя, ведьэто означало бы, что выражение, содержащее нашу операцию индекси­рования, нельзя применять в левой части присваивания.Итак, что же делать в случае, если операция индексирования вызванадля индекса, для которого соответствующий элемент в памяти не хра­9На самом деле мы будем использовать в качестве индекса тип unsigned long;значения этого типа могут достигать 232 - 1, т.

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

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

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

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