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

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

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

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

Такие операторы, как правило, нуждаются в доступе к представлению класса операнда. Следовательно, бинарные операторы наиболее часто являются функциями-друзьями. Если не определены никакие преобразования типов, то нет никаких существенных причин для отдания предпочтения членам по отношению к фуцкциям-друзьякь имеющим в качестве аргумента ссылку, нлп наоборот. В некоторых случаях, программист может отдавать предпочтение одному синтаксису вызова по отношению к другому.

В частности, возникает впечатление, что большинство людей предло пггают фор~у записи гпо (т( для транспонировапия матрицы по сравненшо с тйпо (!. На самом деле, если функция (по (( в действительности транспонирует саму т, а не возвращает новую матрицу, являющуюся транспонированной к т, то она должна быть членом. Прп прочих равных условиях отдавайте предпочтение реализации в виде члена. Невозможно знать о том, определит ли кто-то где-то оператор преобразования. Также невозможно предвидеть, что последуклдпе изменения потребук~т изменения состояния используемых объектов. Синтаксис вызова функции-члена делает очевидным тот факт, что объект может быть изменен; аргумент, являющийся ссылкой. значительно менее очевиден.

Более того, выражения в теле члена мокнут быть заметно короче, чем эквивалентные выражения в глобальной функции; функция, не являющаяся членом, должна использовать явный аргумент, в то время как функция-член может неявно использовать И!я. Кроме того, так как имена членов локальны в пределах класса, опп могут оыть короче имен функций-не-членов. 11.6. Большие объекты Мы определили операторы сотр1ех таким образом, по их операнды имеют тпп сотр!ех, Из этого следует, что при каждом использовании оператора класса сотр!ех, калсдый операнд копируется. Допел нательные затраты на копирование двух ЫоиЫе мо1ут оказаться заметными, по часто мепыпими, чем для пары указателей !доступ через указатель моакет оказаться излишне накладным).

К сожалению, не все классы имеют удобное и компактное представление. Чтобы избавиться от интенсивного копирования, можно обьявпть функции, имеющие в качестве аргументов ссылки. Например: с1азз М а/г!х ( с(оиЫе т(41[4;'; риЫ(с: Ма1пх !'; уиеп4Ма1пхорегаГогь (сопл!Ма!пхс, сопММаГпхВ4 упепг!Матах орегаГог' (сопе1 МаГпхс,, сопе1 Ма!пхс(, 11.6, Большие объекты Ссылки позволяя>т в случае больших объектов пользоваться выражениями, включающими в себя обычные арифметические операторы, без интенсивного копирования.

Указателями нельзя воспользоваться потому, что невозможно заместить смысл оператора, применяемого к указателю. Слозкение можно определить следующим образом: Ма1гск прага!он (сопх! Ма1г!хй ага!, сола!Ма!с!хй ага2) ( Ма !г!х хит, Хог (пм)=О; ~''4; 1-ь~-) уог (!и!1=0,!ч4, !»-~г) хит.т[!][(] = агд'1 т[!][(] ь ага2 т[1][1]; ге!игп хит, Этот орега1о! ь [) осуществляет доступ к операндам по ссылке, но возвращает значе- ние объекта. Возвращение ссылки может показаться более эффективным решением: с1а за Ма1г!х ( 0- 1г!епг1 Ма1пхйорега1ог' (сопх1Ма1г!хй, сопх1Ма1гсхй), 1г!ел!(Ма1г!хй орега(ог [сопз1Ма1пхй, сопИМа1пхй); ), Такое допустимо, но вызывает проблемы прп выделешш памяти.

Так как ссылка на результат будет выдана вызываемой функцией как ссылка на возвращаемое значение, возвращаемое пз функции значение не может быть автоматической переменной (з 7.3). Так как оператор может использоваться более одного раза в выражении, результат не может быть статической локальной переменной, Результат, как прави.ло, будет разыещаться в свободной памяти.

Копирование возвращаемого значения часто обходится дешевле (в смысле времени выполнения, размера кода и данных), чем выделение и (последующее) освобождение памяти под объект. Кроме того, это легче запрограммировать. Существуют методы, позволяющие избежать копирования результата. Простейшигп из них являе ! ся использование буфера статических объектов.

Например: сопз! !п! тах та1г!х 1етр = 7, Ма!Мхйае! та1г!х 1етр () ( аго1гс !п! пЬиГ= О, х1а!!сМа1г!хЬи1[тах та1пх 1етр], (1'(пЬи~== тах та!с!х !етр) пЬиз =О, ге!игл ЬиЯпЬиХ+ч], ма1г!хй орега1ог, (сопз1 ма1пхй ага!, сопх1магпхй пга2) Ма1г!хй гех = ае1 та1г!х 1етр (), ге1игп геж Теперь Ма1ггх копируется только прн присваивании результата выражения. Да помогут вам небеса, если вы напишете выражение, в котором потребуется более, .ем тах та1пх 1етр временных !~ерек!енных) Глава 11. Перегрузка операторов 332 Менее подверженная ошибкам техника подразулэевает определение типа матрицы в качестве дескриптора Я 25.7) для класса-представления, который в действительности хранит данные.

В этом случае матричные дескрипторы могут управлять объектами представления таким образом, чтобы свести к минимуму выделение памяти и копирование (см. 3 11.12 и ~~ 11.14)18)). Однако при таком способе операторы возврашаэот обьекты, а не ссылки или указатели. 1[ругая техника состоит в определении э ернарных операций (операций с тремя аргументами) и автоматическом их вызове для выраженьпэ типа а=Ь+с и а+Ь*! Я 21.4.6.3, 5 22А.7). 11.7.

Важные операторы Как правило, для данного типа Х копирующий конструктор Х(соав1ХВ) о~нечаст за инициализацию объекта того же типа Х. Не лишним будет повторить, что присваивопие и инициализация являются разяииныяш операцияяси Я 10.4А,1). Это имеет особое значение, когда объявлен деструктор. Если класс Х имеет деструктор, который выполняет нетривиальную работу, такую как освобождение памяти, скорее всего классу потребуется полный набор функций, осугцествляюших управление процессалэи конструирования, уничтожения и копирования: Суэпествует еше три случая, когда объект копируется: аргумент функпии, возврашаемое значение функции и исключение.

При передаче аргумента инициализируется формальньш параметр. Соответствуюшая семантика идентична любая другой инициализации. То жс самое пронсходэп для возврагцаемых из функции значений и исклэочений, хотя и в менее очевидной форме. В этих случаях применяется копирукэший конструктор. Например: ,ГГ строка передается по значению 1) (испояьзуя копирующий конструктор) ээээ гтрока возвращается 11 (используя копирующий конструктор) вит'пуд (в1ггпу агу) ( ге1игп агу, эпгтаэп () ( в1ггпув — -"Ньютон", =у(в), гггг строка инициализируется гэг' (исполгьэуя конспэрукэпор) Совершенно ясно, что значение в после вызовами() должно быть" Ньютон". Несложно получить копгпо значения в для аргумента аггг, это осуществляется вызовом коппруюшеэ о конструктора для в1г(пХ. Получение копии этого значения пз Х () требует еше одного вызова в1г(пй(сопз1 в1г(пХЬ) в этот момент инициализируелся временная переменная Я 10А.10), которая затем присваивается переменной в.

Довольно часто одна (но не обе) пз этих операций может быть устранена при оптимизации. с1аев Х( 1г' . Х (5огпе1уре), Х)сопв1ХЙ. ХЪ ар его 1ог= )сопв1 Х Ц, -Х )), ), 1гс консгпрукгпор: создаегп обьектьэ гэгг коээээругюэипэ) конгтруктор г'Г' когтрующее пригваивание. очигтка и коэтрование гээг деструктор: о тетка ззз 11.7. Важные операторы 11.7.1. Явные конструкторы По умолчанию конструктор с единственным аргументом также определяет неявное преобразование.

Для некоторых типов это является идеальным решением. Например, согпр!ех может быть инпциализирована с помощью йг1. // прои ни анализировать г значением сотр1ех !2) сотр!ех г = 2; В других случаях неявное преобразование не'келательно и может привести к озпиб- кам. Например, если бы мы хотели инициализировать з1лпИ размера гп1, то могли бы написать: О создать пороку з с 1п1ра') алел~ ентамп зслпИ з = 'и'; Врял лп зч о то, чего ожидал автор огяределения з.

Неявное преобразование можно подавить, обьявив конструктор с модификатором ехрйсй 1явный). ехрйсг1-конструктор будет вызываться только явно. Б частности, там где копирующий конструктор в принципе необходим Я 11.ЗА), ехрйсй-конструктор не будет вызываться неявно, Например; с!азз 51гяпи ( 0". ехрйсй51лпИ(т1п(; 51лпи(сопз1с1яаг р( // вь~делить и байпг //иниииалазиривщим значен~ ем лаяяется // С-строка р 51г1пи з! = 'а'; 51лпИз2 (10(; 51ггпИз3 = 51лпИ(!0(, 51гтИ з4 = "Влип"; 51гспИ зб ("ха и!10'( ио10/(51лпи(, 51лпИИ(( ( /(10), Х(5 1ггпИ ~(! О((, /("Агйиг"(; //правильно;5!ппИ!"Х~биг") 1 (з1(; 51лпи' р1 = пеш 51лпИ ( Еле (; 51ппИ' р2 = пеш 51гспИ(10(, ге!ига 10, // оасибка: нет явного преобразования 1п! в 5!пни // ошиока: нет явного преобразования сдпг в 50г(пИ // правильно: широка длл хранения 10 символов // правильно: строка длл хранения 10 сил~волов //правильно: з4 = 51ппи!'Впав ) // ошибка: нет явного преобразования Ш1 в 5! ппИ Разница между // оияибка: нет явного преобразования сl~аг а 51ппИ // правильно: строка для хранения 10 га иволог 51г1пИз! ='и', 51лпИв2 (10(, Для класса, в котором копирующий оператор присваивания и копирующий конст- руктор явно не обьявлены программистом, отсутствующая операция нли операции будут сгенерированы компилятором Я 10.2.5), Это означает, что коппрукзшие опе- рации не наследуются Я 12.2.3).

Глава 11. Перегрузка операторов 334 может показаться очень тонкой, но она более заметна в реальном коде, чем в надуманных примерах. В Ра1е мы пользовались простым Гп1 для представления года (Ч 10.3). Ес.лп бы в нашей разработке абстракция Ра1е играла большую роль, мы мотли бы создать тип Уеаг для реализашш более серьезной проверки во время компиляции. Например: // создание Уеагизгт // преобразование Уеаг в!пг // оитбкп: 21 зто не Уепг О правильно Ра1е с!3 (!97В,~еЬ, 21), Ра1е д4 ',21, ГеЬ, Уеаг (197В)), Класс Уеаг является простой «оболочкойг» для типа Гп1. Благодаря оператору гп1() Уеаг неявно преобразуется в Гп1 каждый раз, когда это необходимо. Объявив конструктор ехрйс(1, мы гарантируем, что преобразование ш1 в Уеаг произойдет только тогда, когда мы об этом попросим, и что «случайные» присваивания обнаружатся во время колшиляции.

Так как функции-члены Уеаглетко реализуготся в виде встроенных функций, это не приводит к дополнительным затратам памяти и увеличению времени выполнения. Подобную технику можно глспользовать для типов диапазонов Я 25.6.1). 11.8. Индексация Чтобы придать смысл индексам для объектов класса можно воспользоваться функцией орегаГогЦ. Второй аргумент (индекс) функции орегаГог(2 люжет быть чюбого типа. Это делает возможным определение векторов, ассоциативных массивов п т.

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

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

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

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