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

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 71

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 71 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 712019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Например: !л1орега1ог+ (Тшу, Т!пу), ооЩ(Т!пу 1, шг !) 325 11.4. Операторы преобразования Х)'(Х); У1'(У), Хд(2); ооп( 61 () ( Х(1); У( (!)); Л (!)), я ('Маей'), О неодноэначносп1ь. ЯХ(! )) или/(У( ! ) )? 11 правильно О правильно ,?,? ошибка: требуются пршиенение двух преобразовании', О определенных польза во тепел; у(2(Х('МпсЛ') ) ) не и робуепмя 0 правильно: я(2(Х("0ос ))) О прпвильно: я(7(Х('Биеу"))) д (Х (")лос')); д (Х Гриву')), Преобразования, определяемые пользователем, рассматриваются только если оци необходимы для разрешения вызова. Например: с!аввХХ( /* ... ~!ХХ((п!); ); оо)д 6 (дои61е); ооМ6 (ХХЛ ооМ 62 () 6 (1); 06(допив(l)) или 6(ХХ(!))26(допив(!))! Вызов а (1) означает )с (с(оиЫе (1)), потому что в этом варианте используются ~олька стандартные преобразования (6 7А). Правила преобразования не являются ни самыми простыми для реализации пз всех возможных, нн самыми легкими для документирования, ни настолько общими, как можно себе представить.

Однако они довольно безопасны, и их применение не приводит к неприятным сюрпризам.!'ораздо легче вручную разрешить неоднозначности, чем найти ошибку, вызванную преобразованием, о котором и не подозревзлц. Требование строгого анализа снизу-вверх подразумевает, что возвращаемьш тпп не попользуется при разрешении перегрузки. Например; 11.4.1.

Разрешение неоднозначности Прнсваиванпе значения типа Кобъекту класса Хдопустимо в том случае, если имеет- ся оператор присваивания Хсорега(ог= Д такой, что К является л гнш суц!ествует единственное преобразование $'в Е Инициализация рассматривается анапошггно. В некоторых случаях значение треоуемого типа может быть создано при помощи повторного использования конструкторов и.лп операторов преобразования.

Это дол- жно осуществляться при помощи явных преобразований — допустим только один уровень неявных преобразований, определяемых пользователем. В некоторых случа- ях значение требуемого типа может быть создано более, чем одним спосооом — такое недопустимо. Например: С(аввХ(7* ... '/Х(тг),Х(сБаг');); Сlавв У( )' ... */ У (тг), ), С(аз э Х (?'* ... '?' л (Хь ), Глава 11. Перегрузка операторов 32б с1авв 1)иаас ( риЫ)с 11иад ) с(оп61е), О., С)иас) ирека!ось Диас), С)иаф; иои1 1')с(ои61е а1, с!оиЫе а2) ( Диас( г1 = а1еа2; Яиаг) г2 = С!нас) )а1)к-а2; О сложение г двоинод тонногтью 11 звное указание воснользоватьсл арифлсесникос! )1 с кквадратиннод» точногтью При шна такого подхода при проектировании состояла отчасти в толк что анализ снизу-вверх более понятен и частично в том, что не дело компилятора решать, с какой точностью программист хотел выполнить сложение.

После того, как нри пнициализацни или присваивании типы обеих сторон выражения определены, оба типа используются для разрешения. Например. с1 а ее йеа! ( риЫсс. орега1ог с!ои61е )), орега1ог 1а1)), П" иоЫ я ))!еа! а) ( доиЫе д = а; Ы1с = а, 0 с) = а.доиЫе() с О с = азл11); д=а, г')'у=а ссоиЫе(); с=а, /~ с = а.)а11); ) В зтих случаях анализ типа по-прежнему производится снизу-вверх: учитывается только вид оператора и типы его аргументов. 11.5. Друзья класса Обычное объявление функции-члена гарантирует три логически разные вещи: (1) функция имеет право доступа к закрытой части объявления класса; )2) функция находится в области видимости класса', [3) функцию должна вызываться для объекта класса (имеется указатель 16!в).

Обьявив функцию-член как з1а11с (6 10.2А), мы придаем ей ~олько первые два свойства. Объявив функцию как )г)епс(, мы наделяем ее только первым свойством. Например, мы могли бы определить оператор, который умножает Ма(г(х (матрицу) на )гес1ог (вектор). Естественно, и Ма(гск и )гес1ог скрывают свое представление и обеспечивают полный набор операций для манипулирования объектами их типов. Однако наша процедура умножения не может быть членом обоих классов. С другой стороны, мы не хотим предоставить функции пизкоуровнево~ о доступа, что позво- 327 11.5. Друзья класса .лила бы пользователю и читать и записывать в полное представление Ма1пх и Уес1ог. Во пэбеясанпе этого мы обьявим орега1ог' 'друяоэт ((пеги[) обоих классов: с!аяя Ма1г!к, с1аяя Уяс1ог( У[оа1 о[4), 0" )г1епд Уесгог орегагаг' (сопягМагпхй, соля! Уес1огй~! ), с!аяя Магг!х ( Уяс1ог э[4); О- (т(епг! Уяс1аг орега1аг" (сопя!Магг!хй, сопя1 Уясгогй) ); Уес1пг арегагаг' (слля1МаггЬй т, соля! Уяс1огй о) Уес1ог ~.; ~ог (со!1=0, !<4; ! я) ( О ф) = т[ю) ' я го[к~ =О; 3аг (!пг!'=О; !<4, рн-) г.о[1) += т.о[!).л[)1 * о а[)1, ге1игп г; Обья пление функций-друзей уг!епс( можно поместить и в закрытой п в открытой частях об ьявлс ноя класса — не имеет значения, где именно.

Также как и функции-члены, функции-друзья явно указываются в объявлении класса, друзьяли| которого они являются. Поэтому они в той же мере являются частью интерфейса класса, в какой ею являются функции-члены. Функция-член одного класса может быть другом иного класса. Например; с!аяя ЕЬ1 пега гог ( 0 ... !л1* лех1 (), с!аяя !яя1( )г!елс!1и!*Ия1 1!егагог-пек1[Ь 0" Нередко встречаются случаи, когда все функции одного класса являются друзьями другого.

Для таких случаев существует более короткая форма записи: с)аяя ! !я1 ( уггепс! с!аяя й1я1 Пега!юг; Это объявление уг)епа! делает все функции-члены класса А!я1 !1ега1ог функцпямидруаьямн класса 1!я1. Ясно, что классы-друзья должны использоваться только для отражения тесно связанных концепций. Часто существует выбор ме;кду реализацией класса в качестве члена (вложенного класса) и.ли в качестве друга. Глава 11. Перегрузка операторов 328 11.5.1.

Поиск друзей Также как и объявление члена, объявление/г(епс(ие добавляе~ новое имя в охватывающую ооласть видимости. Например: с(авв Ма!пх ( /г!епс( с!авв Х/огт, !НепдМа!силпоег! (сопя!Ма!ги!! палпеврасе Л'( с1авв Х(/* ... '/); с1аев У( !Иепдс1аввХ; /г) елд с!авв 2; !иепд с(ивл АЕ, /,! друг клисса У ); с1аев с (/'.- '/)! ,!,! друг класса У Лн алогично функцию-друга необходимо явно объявить в охватывающей области видимости, либо она должна иметь аргументы этого класса или класса, наследованного от него. Например: иоЫ3'(Ма!гиб,т) ( //функция тиег! !) — друг класси Л1а!пх лпоег!(т) Из этого следует, что функция-друг класса должна быть либо явно объявлена в охватывающей области видимости, либо иметь аргументы этого класса. В противном случае функцию-друга вызвать нельзя. Например; //<лл!ени !() в этои облосгпи вллдпллослплл нет с1авв Х( !Пеш( ооЫ /(); /П ел д ооЫ !л (сопв! ХЗ ) //ошибки: в лпекулцей облисти видилюсти нет ил~ениЛ/огт Х/огт х; // ошибка: в плекулцей ослпслплл видиллости нет плени(пиен() Ма!ги ("р) (сопя! Ма!г!хо) = с !пиес!; Для бо.льшпх программ и классов просто замечательно, что классы не добавляют «потихоньку» имена в охватывающую область видимости.

Это особенно важно в случае классов-плаблонов, которые могут пнстанцироваться во ыногллх различных контекстах (глава 13). Класс-друг должен быть предварительно объявлен в охватывающей области видимости или определен в области видимости, непосредственно охватывающей класс, объявивший его другом. При этом не принимаются во внимание области видимости вне области видимости самого внутреннего охватывающего пространства имен. Например: с1аввАЕ(/'... */); // не друг кисеи У 329 11.5.

Друзья класса ооЫ д(сопя! Хйф; /(), 6 (х), ) // нет пивни/() в осписспи видал~влаги //Фракция Л(к) — др)гг классаХ 11.5.2. Друзья и члены !пгт! )), т! т2 () сопя!; /г!епс! )и!/! (ХЕ',); ) г)ел с) т(л2 (сопя! ХЦ; )и'епд!'п!)3 (Х), ), Функции-члены можно вызывать только с обвектами их класса; не применяются нн- какис преобразования, определяемые пользователем. Например: оо)а! 9 () ( 99т)() 99 т2 () // отибка: Х(99).т ! !) нв пршсеня ется //скиибка:Х(99).т2() неприменяется ) Здесь преобразование Х (гд!) не применяется для приведения 99 к типу Х.

Глобальная функция /! () имеет сходное свойство, потому что неявные преобразования пе применяются к неконстантным аргументам, которые являются ссылками 8 5.5, 9 11.3.5). Однако преобразования применяются к аргументам функций/2 () и/3 (): оои! Ь () /! (99); // о~иибка .'/! !Х!99)) нв пргсиеняется /2 (99); // правильно:)2 (Х(99) ) /2 (99); // правил ь но:/3 (Х(99) ) Когда мы должны использовать функции-друзья, а когда функции-члены являются лучшим способом введения операции? Во-первых, мы должны свести к минимуму количество функций, имеющих доступ к представлению класса, чтобы оставался только самый необходимый набор.

Поэтому, первый вопрос состоит нс в том . Должна лн эта функция быть членом, статическим членом или другом?», а скорее «Действительно ли этой функции нужен доступ к представлению?и. Как правило, набор функций, которым требуется доступ, меньше, чем нам кажется сначала, Некоторые операции должны быть членами — например, конструкторы, деструкторы и виртуальные функции (9 12.2,6), но, как правило, выбор существует, Так как имена членов являются локальными в классе, функция должна быть членом, если нет специфических причин для того, чтобы она пм не была. Рассмотрим класс Х, реализующий альтернативные способы представления операций: с)авв Х( //,.

Х (гп!) 330 Глава 11. Перегрузка операторов Поэтому оператор, модифпцирувэщнй состояние объекта класса, должен быть членом цли глобальной функцией, имеющей в качестве аргумента неконстантную ссылку (или неконстацтный указатель). Операторы, которые требуют наличия операндов (ча(не для фундаментальнгях типов, ! =, "=, ++ и т. д ) естественней всего определить в качестве членов типов, определяемых пользователем. С другой стороны, если желательно неявное преобразование типов всех операндов в операции, функция должна быть не-членом и иметь аргументом константную ссылку или не ссылку. Это часто происходит в случаях с функциями, реализующими операторы, которые нс требуют наличия операндов!ча!це при применении к фундаментальным типал~ Г+, —, ( и т. д.).

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

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

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

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