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

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

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

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

Инициализаторы полей должныследовать в списке (после двоеточия) в том же порядке, в котором соответстующие поля описаны в классе. Иное, формально говоря, не являетсяошибкой, но хороший компилятор обязательно выдаст предупреждение.§2.17. О писание сим волов операций внек л ассаВ классе Complex мы перегружали символы арифметических опера­ций в виде функций-методов. Благодаря наличию в классе конструкторапреобразования возможно, например, прибавить к комплексному числудействительное:Complex z , t ;И ...z = t + 0 .5 ;(при этом константа 0.5 будет преобразована к объекту Complex с помо­щью конструктора преобразования). В то же время, следующая операцияокажется ошибочной:z=0.5+t;/ / ошибка!Дело тут в том, что метод operator+ может быть вызван только дляобъекта класса Complex, а константа 0.5 таковым не является.

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

Итак, уберём operator+ из класса Complex, а внекласса напишем следующее:Complex operator+(const Complex& a , const Complex& b)48{return Com plex(a.get_re() + b .g e t_ r e ( ),a.get_im () + b .g e t_ im ());}Теперь мы можем написать:Complex z , t ;u ...z = t + 0 .5 ;z = 0.5 + t ;и никаких ошибок это не вызовет.Перегрузка символов стандартных операций в виде отдельных функ­ций (а не методов в классах) может оказаться полезной также и в томслучае, если нам необходимо ввести операцию для объектов некоторогокласса, который мы по тем или иным причинам не можем изменить; на­пример, этот класс может быть частью библиотеки, созданной другимпрограммистским коллективом, от которой у нас нет исходных текстов(к сожалению, несмотря на успехи OpenSource, такие ситуации пока чтоне редкость).§2.18.

Д р у ж еств ен н ы е ф у н к ц и и и кл ассыВ некоторых случаях бывает полезно сделать исключения из запре­тов, налагаемых механизмом защиты. В языке С и + + класс или структу­ра, имеющие защищенную часть, могут объявить ту или иную функциюсвоим «другом» (friend); в этом случае из тела такой д р у ж е ст в е н н о йфункции все детали реализации класса или структуры будут доступны.Можно объявить «дружественным» также целый класс или структуру;эффект от этого будет такой же, как если бы мы объявили дружествен­ными все методы дружественного класса.

Иначе говоря, если в классеА будет заявлено, что класс В является для него дружественным, то вовсех методах класса В будут доступны все детали реализации класса А.Применять механизм дружественных функций и классов следует состорожностью. Как мы видели в § 2.1.4, защита деталей реализациикласса — механизм очень полезный; как можно догадаться, необдуман­ные исключения из него могут нанести существенный вред.Одна из ситуаций, в которых применение механизма дружествен­ных функций можно считать практически безопасным — это выносперекрытых символов стандартных операций за пределы класса, какэто обсуждалось в предыдущем параграфе.

Как можно заметить, в те­ле функции operator+ мы были вынуждены пользоваться методами49Complex: :g e t_ re () и Complex: :get_im (), поскольку из функции, не яв­ляющейся формально методом класса Complex, прямого доступа к полямге и im нет. Однако использование методов доступа (так называемых аксессоров) не всегда удобно, к тому же их может попросту не быть; частобывает так, что некоторые детали реализации не следует делать доступ­ными даже через метод доступа.Ситуацию можно исправить с помощью механизма дружественныхфункций. Для начала в заголовок класса Complex вставим директивуfrien d , объявив функцию operator+ дружественной.

Для этого нужнозаписать прототип дружественной функции, предварив его директивойfriend:c la s s Complex {frie n d Complex operator+(const Complex&, const Complex&);//...Теперь мы можем переписать функцию operatort, используя напрямуюполя складываемых объектов (то есть без обращения к методам g e t_ re()и get_im ()):Complex operator+(const Complex& a , const Complex& b){return Complex(a.re + b .r e , a.im + b .im );}Сравните это описание с тем, которое мы приводили на стр.

49.Конечно, дружественной может быть и обычная функция:c la s s C ls l {frie n d void f ( i n t , const char * ) ;//...>;void f ( i n t , const char *){/ / здесь можно использовать закрытые поля C lsl}Чтобы сделать дружественным сразу целый класс, следует после сло­ва frie n d написать « c la s s имя»:c la s s А {frie n d c la s s В;I I ...>;50Использовать такой вариант «дружбы» следует с особенной осторож­ностью, только в ситуации, когда понятия, описываемые обоими клас­сами, тесно связаны между собой; желательно сначала задать себе во­прос, нельзя ли обойтись без friend. Большим злом, чем использование«дружественных» отношений, является разве что введение публичныхметодов доступа к деталям, которые по смыслу должны быть скрыты,либо снятие защиты с внутренних полей: ясно, что «дружественность»всё-таки ограничивает объём кода, который придётся просмотреть приизменении реализации класса, так что использование frien d заведомопредпочтительнее полного отказа от защиты.

С примерами ситуаций, ко­гда применение «дружественных» классов оказывается оправданно, мыстолкнёмся в нашем курсе позже.§2.19. О собенности п ереоп ределен и янекоторы х операций§2.19.1. Переопределение операций присваиванияНапомним, что присваивание является в языках Си и С и + + опера­цией, а не оператором, как в Паскале и большинстве других языков.Это выражается в том, что запись вида «а = выражение» сама по се­бе является выражением, имеющим значение, и, таким образом, можетвходить в состав других выражений.

То же самое можно сказать и прооперации присваивания, совмещённые с арифметическими действиями,такие как +=, -=, <<=, | = и др. Как мы уже отмечали, все эти операциимогут быть переопределены для классов и структур, введённых пользо­вателем. Здесь действует, однако, некоторое ограничение: все операцииприсваивания могут переопределяться только как м етоды к л асса илиструктуры , а определять их в виде обычных функций нельзя.Как правило, при переопределении операций присваивания учитыва­ют, что обычное присваивание возвращает значение, которое только чтобыло присвоено. Из этих соображений из операции присваивания воз­вращают либо копию объекта, либо (что предпочтительнее) константнуюссылку на объект, для которого операция была вызвана. Это, однако, необязательно: язык С и + + не требует именно такого оформления опера­ций присваивания.

Можно, в частности, сделать операцию присваиванияфункцией типа void, то есть не возвращающей никакого значения. На­пример, для нашего класса Complex мы могли бы написать такие опера­ции:c la s s Complex {II . . .const Complex& operator=(const Complex& c)51{ re = c .r e ; im = c.im ; return * t h i s ; }const Complex& operator+=(const Complex& c){ re += c .r e ; im += c.im ; return * t h i s ; }// ...>;или, если нас не слишком волнуют семантические традиции, можно былобы написать и так:c la s s Complex {// ...void operator=(const Complex& c){ re = c .r e ; im = c.im ; }void operator+=(const Complex& c){ re += c .r e ; im += c.im ; }// ...>;Здесь стоит ответить на один вопрос, часто возникающий у студентов.Операции +=, -= и другие подобные им являются с точки зрения языкаС и + + полностью самостоятельными, то есть, например, операция += ни­как не связана ни с операцией =, ни с операцией +.

Если мы опишем внекотором классе операции = и +, это само по себе не даст нам возможно­сти применять к объектам этого класса операцию +=, она должна бытьописана отдельно.Аргумент операции присваивания не обязан иметь тот же тип, чтои описываемый класс. Так, для комплексных чисел мы могли бы опре­делить и присваивание комплексной переменной действительного числа,например, так:c la s s Complex {// ...void operator=(double x) { re = x; im = 0; }// ...>;Однако операция присваивания, аргумент которой представляет объекттого же класса (или ссылку на такой объект, как в предыдущем примере),имеет одну важную особенность: как и некоторые конструкторы, такаяоперация генерируется неявно, если её не описать.

Это вполне понят­но, ведь в языке Си можно было присваивать между собой переменные,имеющие один структурный тип, и эта возможность была унаследова­на в С и ++. В случае, если по каким-либо причинам присваивание объ­ектов описываемого класса желательно запретить, достаточно описатьоперацию присваивания с аргументом «константная ссылка на объектописываемого класса» в приватной части класса:52c la s s A {// ...p r iv a te :void operator=(const A& r e f) -Q / / no assignments>;§2.19.2.

Переопределение операции индексированияОперация извлечения элемента из массива, обозначаемая квадрат­ными скобками, как известно, является арифметической операцией надуказателем и целым числом; в языке Си выражение «а[Ъ]>> полностьюэквивалентно выражению « * (а+Ъ) », что лишний раз подчёркивает ариф­метическую сущность индексирования. В языке С и + + операцию индек­сирования можно переопределить для объектов класса или структуры,заставив, таким образом, объект в некоторых случаях выглядеть синтак­сически похожим на обычный массив или даже просто исполнять рольмассива.

Отметим, что, подобно операциями присваивания, операция ин­дексирования может быть переопределена только как метод класса илиструктуры.Для примера опишем класс, объект которого представляет собой мас­сив целых чисел с заранее неизвестным размером, который при обраще­нии к несуществующим (пока) элементам автоматически увеличивается вразмерах. Хранить элементы массива будем в динамически создаваемоммассиве, скрытом в приватной части класса. Исходно создадим массивразмером 16 элементов, а при возникновении такой необходимости будемудваивать его размеры до тех пор, пока нужный нам индекс не станетдопустимым.Заметим, что при попытке копирования объекта такого класса воз­никнет проблема с разделением одного и того же массива в динамиче­ской памяти между двумя объектами класса (подробно проблема описанав § 2.11).

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

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

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

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