Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 75
Текст из файла (страница 75)
Для того чтобы различать чтение н запись, $1ппуаорвга1ог[( [) возвращает Сге), когда вызывается с пеконстантным объектом. Сгеу ведет себя наподобие сйагй, за исключением того, что он вызывает $1ппус$герсде1 ошп сору () при записи в него: с!авв 81ппунйге2( О ссылка на в[!) Уг!елг! с!авв 5 1г(пд; $1глпуй в, !'п1 1, Скет($Фппуй вв, ьп1 Д): в (вв), ! (1!) () риЫ!а арега!вг с)! аг [) сапв1 ( ге1игп в геаь((л); ) 0 вьн)апгь з~аквнпе ра!ь! арега!аг= [сБаг с) ( влвп1в (1, ь), ) ,')'пзлюентпь значение 345 11.12. Класс 811!п0 1)ля завершения класса 5!т!лая добавил несколько полезных функций; с(аии 51т!пу ( 5!т!пуй орега1огч= — (сопя! 5!пну&11 $!ппуй орета1ог ' = (сопя1 сьаг'), 1тсепд оя!театй арета!ог«(оя1театй, сопи1 5!ггпу&), Гт!епс( ЬИгеаглй орега1ог» (!иггеатй, 51ппд&); кепд Ьоо! арета!от== (солк1 51ппуй х, соли! сдпг' я) ( ге1игл я1гстр (х.гер->и, и) == О, ) ~пепд Ьоо! орета1от== (сопя151т!луй х, соли! $1плдй у) ( те!игп я!гетр (х гер — >и, у гер — >и) == О, ) ~пепд Ьоо! орега1ог1= (соли151ппуй х, сопи1 идат' я) ( те!игл к!гетр (х.тер — >я, я) ы О, ) Гпепд Ьоо! арета!од= (сопя! 51ппдй х, сопя! 51ппуй у) ( ге1игл Игстр (ххер — я, у.тер — я)!= О; ) 5!т!пу арета 1огь (сопя!5!г!пуй, солИ 5!с!луй); $1плуорега1от>(соля151т!лу&, сопИ сЬа! ); С целью зкономии места, я оставляю операции ввода/вывода и конкатенации в качестве упражнений.
Главная программа просто пользуется операторами 51г1лд. 5П !пу~(51т!ну а, 5!т!луб) ( а[2) = 'х', сдагс=6[5] сои1 «'вид!при.г:.'«а «''«Ь «' '«с«",и', ге1игп Ь, !п1 таил () 51плдх у сои1 « "Пожалуйста, введите две опроки'~п', с!л»х»у; сои! « 'введено: " «х « ' ' «у « '1л'; $1у!пя е = х; у =Д(х, у); (1(х ы е) сои1 « "х испорченаап"; х[О) = т); (Г (х == х) сои! "ошибка записи!',и; сои1«'выход, ' «х«' '«у«' ' «г «'~л', В нашем классе 51пщ отсутствует много возможностей, которые вы, быть может, считаете важными нли даже жизненно неооходимымн. Например, в нем нет операции извлечешяя представления в виде С-строки Я 11.14[10), глава 20).
346 Глава 11, Перегрузка операторов 11.13. Советы [1] Определяйте операторы в основном для имитации привычной формы записи; 9 11.1, [2] Для больших по размерам операндов используйте аргументы с типом константных ссылок; 9 11.6. [3] Прп больших по размерам результатах рассмотрите возможность оптимизации возвращаемого значения; з 11.6. [4] Отдавайте предпочтение операциям копирования по умолчанию, если они подходят для вашего класса; 9 11.3.4. [5] Замещайте пли запрещайте копирование, если умолчание не подходит для данного типа; 9 11.2.2.
[6] Отдавайте предпочтение функциям-членам над функциями-не-членами для операций, которым требуется непосредственный доступ к представлению; 3 11.5 2. ]7] Отлавайте предпочтение функциям-не-членам по отношению к функциям-членам для операций, которым нс требуется доступ к представленшо; 9 11 5 2. [8] Пользуйгссь пространствами имен для указания связи функций-помощников с ппх» классом; з 11.2,4.
[9] Пользуйтесь функциями-не-членами для симметричных операторов; З 11.3.2. [10] Пользуйтесь оператором (] для индексов в многомерных массивах; 6 11.9. [11] Объявляйте конструкторы с единственным чаргумептом, задающим размера, как ехр1?с?б 9 11.7.1. [12] В общих случаях отдавайте предпочтение стандартномуклассу Иг1пд [глава 20), а не результатам ваших собственных упражнений; 9 11.12. [13] Будьте осторожны прн введении неявных преобразовании; З 11 4. [14] Пользуйтесь функциями-членами для выражения операторов, которые требуют (уа(не в качестве левого операнда; 6 11.3.5. 11.14.
Упражнения 1. ['2) Какие преобразования выполняются в каждом выражении в следующей программе? 8сгисГ Х( 1пг 6 Х (?пф Х орегон"> (! пб, 1; зсгисг У( 1пс б У(Х]; У орегагогь (х]; орегагог он ((; ); ексегп Х орегасог* (Х, У]; ексегп щи" (Х(; Хх=б 347 11.14. Упражнения уу=х; ьпьь= 2, !и! ьла!и () гь!О, х.ьу ьй /(у( у.ь!д; У-!ЬЬ'У, к*хай Ю !дб у, с!азз 5!г!пу Пег( //ссылка на спьраку и гмелекя сяраки риЫ!с 5!гту !!сгьь3!г!луйк(, с!ь ага, пех1 (); // операции па еиьиеип! выбору //ияератар длп з // ссьыка ни следующий элемент 10.
11. 12. 2 3 4 6 7 Измените программу таким образом, чтобы она прп запуске выводила значения всех допустимых выражений. ('2) Завершите и оттестируйте класс 51г!пана ~ 11.12. ("2) Определите класс ТМТ, который ведет себя точно так же как ьп1. Подсказка: оп ред ел и те!!х' Тиаре га 1ог гп1 ((. ('1) Определите класс КТ!йТ, которыя ведет себя как !п1, за нсключеппеьь тоь.о, что допустимы только операторы ь (уцарпый и бинарный), — (унарный и би- нарный), ', / и ",4. Подсказка: нс определяйте ьс1НТсорега1ог !п1 ((.
(*3) Оь ьределите класс ПЯТ которьш ведет себя как ьк1МТ но для представлен ня чисел использует по крайней мере 64 бптз. ("4) Определите класс, реализующий арифметику с произвольной точностью. Оттестируйте его, вычислив факториал 1000. Подсказка: вам потребуется уп- равление памятью наподобие того, как это сделано в классе 51г!пд, (*2) Определите внешний итератор для класса Яг!пу! Сравьььлте это по удобству, стилю программирования и эффективности с внуь- ренним итератором для Яппи(который бы вводил понятие текущего элемента для Яг!пуп операции, относящиеся к этому элементу), ('1.5) Реализуйте оператор взятия подстроки для класса строк, используя пере- грузку (). Какьле еще операции вы хотели бы выполнять со строкамп? ('3) Разработайте класс 51г!пдтакььм образом, чтобы оператор подстроки мож- но было использовать в левой части оператора црнь:вливания.
Сначала наннщн- те версикх в которой строка может быть присвоена подстроке того же размера. Затем нашпвите версию, в которой размеры могут отличаться. (*2) Определите оператор для Яг!пд, которьп| возвращает представление строки в виде С-строки. Обсудите все за п против реалпзациц такой операции в виде оператора преобразования. Обсудите различные варианты выделения памяти под представление в виде С-строки. ("2.5) Определите и реализуйте простое средство для поиска подстрок в строках Яг!пу. (*1.5) Модььфььцььруйте предыдущий пример из 6 11.14(11) таким образом, чтобы он работал со строками з1г!пд нз стандартной библиотеки. Бы не можете изме- нить определение з!г!пд; 348 Глава 11.
Перегрузка операторов 13 14 15 16 17 18 19 20 21. 22. ('2) Напишите программу, которая будет совершенно нечитабельна из-за использования перегрузки операторов и макросов. Идея: определите +, имеющий смысл оператора — (и наоборот) для Р~Т, затем напишите макрос, который заставлял бы !п1значпть й«Т. Заместите часто употребляемые функции с использованиел~ ссылок в качестве аргументов. Несколько неверных комментариев также создадут изрялнгло путаницу. (*3) Обменяйтесь результатами упражнения 3 11.14113) с кем-нибудь нз своих друзей.
Не запуская, попы гайтесь определить, что делает программа вашего приятеляя. Теперь вы знаете, чего не следует делать. (*2) Определите тип гес4 как вектор из четыреху7оа1. Определите орега1ог() для Уес4. Определите операторы+, —, "„', =, +5ч -=, *= ну= для комбинаций вектор, и и чисел с плаваюшей то ~кой. ('3) Определите класс Ма(4 как вектор из четырех Уес4. Опредеэпгге орега1ог(), возврашаюгций Иес4 из Ма!4, Определите обычныс матричные операции для этого типа. Определите функцию, реализуюшую метод исключения Гаусса. (*2) Определите класс 1 ес1ог по аналогии с Ъес4, но с размером, являюшимся аргументом конструктора Уес1огХес1ог (1и1).
(*3) Определите класс Ма1г(х по аналошш с Ма(г!х4, но с размерами, задаваемыми в качестве аргументов конструктора Ма!г(хсМа1г(х ((п1, !п1). (*2) Завершите класс Р(г 1о Тиз й' 11.11 и протестируйте его. Чтобы быть полным, Р1г 1о Т должен, по крайней мере, иметь операторы *, — >, =. ++ и —. Сделайте так, чтобы ошибка па этапе выполнения не возникала до того, как реально производится разыменовапие «впсячей> ссылки.
(*1) Используя две структуры: зггис! 8 ( гп! х, у, ), зггис! Т ( сдаг«р; сдпг«д, ); напишите класс С, который допускает использование х и р из некоторых 5 и Т, примерно так же, как если бы х и р были членами С ('1.5) Определите класс!пг(ех д.ля хранения степени показательной функции туров (г(оиб(е, Тпс(ех). Найдите способ, при котором 2**7вызывает турош(2, 1), (*2) Определите к.ласс Ттау(лагу для представления мнимых чисел.
Оп ределите на его основе класс Сотр1ех. Реализуйте основные арифметические операции. Производные классы Ие лгножьте обьектгя без необхос) илшсти. — В. Окнам Концепции и классы — производные классы — функции-члены конструирование н уничтожение —. иерархии классов — поля типа— виртуальные функции — абстрактньге клагсы — традиционные иерархии классов — абстрактныс классы как интерфейсы -- локализация создания объекта — абстрактные классы п иерархии классов — советы — упражнения.
12.1. Введение С++ позаимствовал из Вппп)а концепции класса, как определяемого пользователем типа, н иерархий классов. Кроме того, в системное проектирование была привнесена пдся, что клас< ы должны использоваться для моделирования концепций реального и программного мира. С++ предоставляет конструкции языка, непосредственно поддерживающие эту концепцию проектирования. С другой стороны, тесная связь с концепциями проектирования делает С»» очень эффективным. Использование конструкций языка просто в качестве подпорок для традиционного программированияя означает потерю основных достоинств С++. Нн одна концепция не существует в изоляции.