﻿<?php
echo "<p class=bmenu><span class=MsoHyperlink><a href=\"#_Toc219968017\">Глава 6\n";
echo "Перегрузка Операций<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>164</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968018\">6.1 Введение<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>164</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968019\">6.2 Функции Операции<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>165</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968020\">6.2.1\n";
echo "Бинарные и Унарные Операции<span style='color:windowtext;display:none;\n";
echo "text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>165</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968021\">6.2.2\n";
echo "Предопределенный Смысл Операций<span style='color:windowtext;display:none;\n";
echo "text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>166</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968022\">6.2.3\n";
echo "Операции и Определяемые Пользователем Типы<span style='color:windowtext;\n";
echo "display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>167</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968023\">6.3 Определяемое Пользователем\n";
echo "Преобразование Типа<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>167</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968024\">6.3.1\n";
echo "Конструкторы<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>168</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968025\">6.3.2\n";
echo "Операции Преобразования<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>169</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968026\">6.3.3\n";
echo "Неоднозначности<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>170</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968027\">6.4 Константы<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>172</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968028\">6.5 Большие Объекты<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>172</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968029\">6.6 Присваивание и\n";
echo "Инициализация<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>173</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968030\">6.7 Индексирование<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>175</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968031\">6.8 Вызов Функции<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>177</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968032\">6.9 Класс String<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>178</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968033\">6.10 Друзья и Члены<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>181</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968034\">6.11 Предостережение<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>182</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968035\">6.12 Упражнения<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>183</span></a></span></span></p>\n";
echo "\n";
echo "<h1><a name=\"_Toc219968017\">Глава 6 Перегрузка Операций</a></h1>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:257.4pt;margin-bottom:.0001pt;text-autospace:none'>Здесь\n";
echo "водятся Драконы!</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:290.4pt;text-autospace:none'>- старинная карта</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В этой главе описывается аппарат, предоставляемый в\n";
echo "С++ для перегрузки операций. Программист может определять смысл операций при их\n";
echo "применении к объектам определенного класса. Кроме арифметических, можно\n";
echo "определять еще и логические опе­рации, операции сравнения, вызова () и\n";
echo "индексирования [], а также можно переопределять присваивание и инициализацию.\n";
echo "Мож­но определить явное и неявное преобразование между определяе­мыми\n";
echo "пользователем и основными типами. Показано, как опреде­лить класс, объект\n";
echo "которого не может быть никак иначе скопирован или уничтожен кроме как\n";
echo "специальными определенными пользователем функциями.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968018\">6.1 Введение</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Часто программы работают с объектами, которые\n";
echo "являются конкретными представлениями абстрактных понятий. Например, тип данных\n";
echo "int в С++ вместе с операциями +, -, *, / и т.д. предоставляет реализацию\n";
echo "(ограниченную) математического поня­тия целых чисел. Такие понятия обычно\n";
echo "включают в себя мно­жество операций, которые кратко, удобно и привычно представ­ляют\n";
echo "основные действия над объектами. К сожалению, язык программирования может\n";
echo "непосредственно поддерживать лишь очень малое число таких понятий. Например,\n";
echo "такие понятия, как комплексная арифметика, матричная алгебра, логические\n";
echo "сигналы и строки не получили прямой поддержки в С++. Классы дают средство\n";
echo "спецификации в С++ представления неэлементарных объ­ектов вместе с множеством\n";
echo "действий, которые могут над этими объектами выполняться. Иногда определение\n";
echo "того, как действуют операции на объекты классов, позволяет программисту обеспе­чить\n";
echo "более общепринятую и удобную запись для манипуляции объ­ектами классов, чем та,\n";
echo "которую можно достичь используя лишь основную функциональную запись. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class complex (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double re, im;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex(double r, double i) (* re=r; im=i; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator+(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator*(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>определяет простую реализацию понятия комплексного\n";
echo "чис­ла, в которой число представляется парой чисел с плавающей точкой двойной\n";
echo "точности, работа с которыми осуществляется посредством операций + и * (и\n";
echo "только). Программист задает смысл операций + и * с помощью определения функций\n";
echo "с именами operator+ и operator*. Если, например, даны b и c типа complex, то\n";
echo "b+c означает (по определению) operator+(b,c). Те­перь есть возможность\n";
echo "приблизить общепринятую интерпретацию комплексных выражений. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void f()</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex a = complex(1, 3.1);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex b = complex(1.2, 2);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>complex c = b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>a = b+c;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>b = b+c*a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>c = a*b+complex(1,2);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Выполняются обычные правила приоритетов, поэтому\n";
echo "второй оператор означает b=b+(c*a), а не b=(b+c)*a.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968019\">6.2 Функции Операции</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Можно описывать функции, определяющие значения следующих операций:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>+ - * / % ^\n";
echo "&amp; ! ~ !</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>= &lt; &gt;\n";
echo "+= -= *= /= %= ^= &amp;=</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>!= &lt;&lt;\n";
echo "&gt;&gt; &gt;&gt;= &lt;&lt;= == != &lt;= &gt;= &amp;&amp;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>!! ++ -- [] () new delete</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Последние четыре - это индексирование (#6.7), вызов\n";
echo "функции (#6.8), выделение свободной памяти и освобождение свободной памяти\n";
echo "(#3.2.6). Изменить приоритеты перечисленных операций невозможно, как невозможно\n";
echo "изменить и синтаксис вы­ражений. Нельзя, например, определить унарную операцию\n";
echo "% или бинарную !. Невозможно определить новые лексические символы операций, но\n";
echo "в тех случаях, когда множество операций недоста­точно, вы можете использовать\n";
echo "запись вызова функции. Исполь­зуйте например, не **, а pow(). Эти ограничения\n";
echo "могут пока­заться драконовскими, но более гибкие правила могут очень легко\n";
echo "привести к неоднозначностям. Например, на первый взгляд определение операции\n";
echo "**, означающей возведение в степень, мо­жет показаться очевидной и простой\n";
echo "задачей, но подумайте еще раз. Должна ли ** связываться влево (как в Фортране)\n";
echo "или вправо (как в Алголе)? Выражение a**p должно интерпретиро­ваться как a*(*p)\n";
echo "или как (a)**(p)?</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Имя функции операции есть ключевое слово operator (то\n";
echo "есть, операция), за которым следует сама операция, например, operator&lt;&lt;.\n";
echo "Функция операция описывается и может вызываться так же, как любая другая\n";
echo "функция. Использование операции - это лишь сокращенная запись явного вызова\n";
echo "функции операции. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f(complex a, complex b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>complex c = a\n";
echo "+ b; // сокращенная запись</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex d = operator+(a,b); // </span>явный вызов</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>При наличии предыдущего описания complex оба инициализа­тора являются\n";
echo "синонимами.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968020\">6.2.1 Бинарные и Унарные Операции</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Бинарная операция может быть определена или как\n";
echo "функция член, получающая один параметр, или как функция друг, получа­ющая два\n";
echo "параметра. Таким образом, для любой бинарной опера­ции @ aa@bb может\n";
echo "интерпретироваться или как aa.operator@(bb), или как operator@(aa,bb). Если\n";
echo "определены обе, то aa@bb является ошибкой. Унарная операция, префиксная или\n";
echo "постфиксная, может быть определена или как функция член, не получающая\n";
echo "параметров, или как функция друг, получающая один параметр. Таким образом, для\n";
echo "любой унарной операции @ aa @ или @aa может интерпретироваться или как\n";
echo "aa.operator@(), или как operator@(aa). Если определено и то, и другое, то и aa@,\n";
echo "и @aa являются ошибками. Рассмотрим следующие примеры:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class X (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>// </span>друзья</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend X operator-(X);                               // </span>унарный\n";
echo "минус</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend X operator-(X,X);   // </span>бинарный минус</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend X operator-();                                  // </span>ошибка<span\n";
echo "lang=EN-US>: </span>нет операндов</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>friend X\n";
echo "operator-(X,X,X); // </span>ошибка<span lang=EN-US>: </span>тернарная</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// члены (с неявным первым\n";
echo "параметром: this)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>X*\n";
echo "operator&amp;();                                        // унарное &amp;\n";
echo "(взятие адреса)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>X\n";
echo "operator&amp;(X);                                       // бинарное &amp;\n";
echo "(операция И)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>X operator&amp;(X,X);                                   //\n";
echo "ошибка: тернарное</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Когда операции ++ и -- перегружены, префиксное использо­вание и\n";
echo "постфиксное различить невозможно.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968021\">6.2.2 Предопределенный Смысл Операций</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Относительно смысла операций, определяемых\n";
echo "пользовате­лем, не делается никаких предположений. В частности, посколь­ку не\n";
echo "предполагается, что перегруженное = реализует присваивание ее первому операнду,\n";
echo "не делается никакой провер­ки, чтобы удостовериться, является ли этот операнд\n";
echo "lvalue (#с.6).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Значения некоторых встроенных операций определены как\n";
echo "равносильные определенным комбинациям других операций над те­ми же аргументами.\n";
echo "Например, если a является int, то ++a оз­начает a+=1, что в свою очередь\n";
echo "означает a=a+1. Такие соотно­шения для определяемых пользователем операций не\n";
echo "выполняются, если только не случилось так, что пользователь сам определил их\n";
echo "таким образом. Например, определение operator+= () для ти­па complex не может\n";
echo "быть выведено из определений complex::operator+() и complex::operator=().</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-align:justify;text-indent:33.0pt;text-autospace:\n";
echo "none'>По историческому совпадению операции = и &amp; имеют опреде­ленный смысл\n";
echo "для объектов классов. Никакого элегантного спо­соба &quot;не определить&quot;\n";
echo "эти две операции не существует. Их мож­но, однако, сделать недееспособными для\n";
echo "класса X. Можно, например, описать X::operator&amp;(), не задав ее определения.\n";
echo "Если где-либо будет браться адрес объекта класса X, то компо­новщик обнаружит\n";
echo "отсутствие определения*. Или, другой способ, можно определить\n";
echo "X::operator&amp;() так, чтобы она вызывала ошиб­ку во время выполнения.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>____________________</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>* В некоторых системах компоновщик настолько\n";
echo "&quot;умен&quot;, что ругается, даже если неопределена неиспользуемая функция.\n";
echo "В таких системах этим методом воспользоваться нельзя. (прим ав­тора)</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968022\">6.2.3 Операции и Определяемые Пользователем Типы</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Функция операция должна или быть членом, или\n";
echo "получать в качестве параметра по меньшей мере один объект класса (функ­циям,\n";
echo "которые переопределяют операции new и delete, это де­лать необязательно). Это\n";
echo "правило гарантирует, что пользова­тель не может изменить смысл никакого\n";
echo "выражения, не включающего в себя определенного пользователем типа. В част­ности,\n";
echo "невозможно определить функцию, которая действует иск­лючительно на указатели.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Функция операция, первым параметром которой предполага­ется\n";
echo "основной встроенный тип, не может быть функцией членом. Рассмотрим, например,\n";
echo "сложение комплексной переменной aa с целым 2: aa+2, при подходящим образом\n";
echo "описанной функции чле­не, может быть проинтерпретировано как aa.operator+(2),\n";
echo "но с 2+aa это не может быть сделано, потому что нет такого класса int, для\n";
echo "которого можно было бы определить + так, чтобы это означало 2.operator+(aa).\n";
echo "Даже если бы такой тип был, то для того, чтобы обработать и 2+aa и aa+2,\n";
echo "понадобилось бы две различных функции члена. Так как компилятор не знает смысла\n";
echo "+, определяемого пользователем, то не может предполагать, что он коммутативен,\n";
echo "и интерпретировать 2+aa как aa+2. С этим примером могут легко справиться\n";
echo "функции друзья.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Все функции операции по определению перегружены. Функция\n";
echo "операция задает новый смысл операции в дополнение к встроен­ному определению, и\n";
echo "может существовать несколько функций опе­раций с одним и тем же именем, если в\n";
echo "типах их параметров имеются отличия, различимые для компилятора, чтобы он мог\n";
echo "различать их при обращении (см. #4.6.7).</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968023\">6.3 Определяемое Пользователем Преобразование Типа</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Приведенная во введении реализация комплексных\n";
echo "чисел слишком ограничена, чтобы она могла устроить кого-либо, поэ­тому ее нужно\n";
echo "расширить. Это будет в основном повторением описанных выше методов. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class complex (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double re, im;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "26.6pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>complex(double\n";
echo "r, double i) (* re=r; im=i; *) </span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator+(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator+(complex, double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>friend complex\n";
echo "operator+(double, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator-(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator-(complex, double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator-(double, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>complex\n";
echo "operator-()                                                                         //\n";
echo "</span>унарный<span lang=EN-US> -</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator*(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator*(complex, double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>friend complex\n";
echo "operator*(double, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Теперь, имея описание complex,\n";
echo "мы можем написать:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex a(1,1), b(2,2), c(3,3), d(4,4), e(5,5);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>a = -b-c;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>b = c*2.0*c;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>c = (d+e)*a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Но писать функцию для каждого сочетания complex и\n";
echo "double, как это делалось выше для operator+(), невыносимо нудно. Кроме того,\n";
echo "близкие к реальности средства комплексной арифметики должны предоставлять по\n";
echo "меньшей мере дюжину таких функций. Посмотрите, например, на тип complex, описанный\n";
echo "в &lt;complex.h&gt;.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968024\">6.3.1 Конструкторы</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "39.9pt;margin-left:0cm;text-align:justify;text-indent:33.0pt;text-autospace:\n";
echo "none'>Альтернативу использованию нескольких функций (перегру­женных) составляет\n";
echo "описание конструктора, который по заданно­му double создает complex. Например<span\n";
echo "lang=EN-US>: </span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class complex (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex(double r) (* re=r; im=0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Конструктор, требующий только один параметр,\n";
echo "необяза­тельно вызывать явно:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex z1 = complex(23);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>complex z2 = 23;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>И z1, и z2 будут\n";
echo "инициализированы вызовом complex(23).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Конструктор - это предписание, как создавать\n";
echo "значение данного типа. Когда требуется значение типа, и когда такое значение\n";
echo "может быть создано конструктором, тогда, если такое значение дается для\n";
echo "присваивания, вызывается конструктор. Например, класс complex можно было бы\n";
echo "описать так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class complex (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double re, im;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>complex(double\n";
echo "r, double i = 0) (* re=r; im=i; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator+(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend complex operator*(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>и действия, в которые будут входить переменные\n";
echo "complex и целые константы, стали бы допустимы. Целая константа будет интерпретироваться\n";
echo "как complex с нулевой мнимой частью. Нап­ример, a=b*2 означает:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>a=operator*( b,\n";
echo "complex( double(2), double(0) ) )</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Определенное пользователем преобразование типа\n";
echo "применя­ется неявно только тогда, когда оно является единственным.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Объект, сконструированный с помощью явного или неявного\n";
echo "вызова конструктора, является автоматическим и будет уничто­жен при первой\n";
echo "возможности, обычно сразу же после оператора, в котором он был создан.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968025\">6.3.2 Операции Преобразования</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Использование конструктора для задания преобразования\n";
echo "типа является удобным, но имеет следствия, которые могут ока­заться\n";
echo "нежелательными:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>[1]            Не \n";
echo "может быть неявного преобразования из определен-</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>ного\n";
echo "пользователем типа в основной тип (поскольку основ­ные типы не являются\n";
echo "классами)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>[2]            Невозможно\n";
echo " задать  преобразование  из нового типа в</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>старый, не изменяя описание\n";
echo "старого</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>[3]            Невозможно\n";
echo "иметь конструктор с одним параметром,  не</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>имея при этом преобразования.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Последнее не является серьезной проблемой, а с\n";
echo "первыми двумя можно справиться, определив для исходного типа операцию\n";
echo "преобразования. Функция член X::operator T(), где T - имя ти­па, определяет\n";
echo "преобразование из X в T. Например, можно опре­делить тип tiny (крошечный),\n";
echo "который может иметь значение только в диапазоне 0...63, но все равно может свободно\n";
echo "соче­таться в целыми в арифметических операциях:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class tiny (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char v;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int assign(int i)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:26.4pt;text-autospace:\n";
echo "none'><span lang=EN-US>(*return v=(i&amp;~63) ? (error(&quot;</span>ошибка диапазона<span\n";
echo "lang=EN-US>&quot;),0):i;*) public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>tiny(int i) (* assign(i); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>tiny(tiny&amp; i) (* v = t.v; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int operator=(tiny&amp; i) (* return v = t.v; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int operator=(int i) (* return assign(i); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>operator int() (* return v; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Диапазон значения проверяется всегда, когда tiny\n";
echo "инициа­лизируется int, и всегда, когда ему присваивается int. Одно tiny может\n";
echo "присваиваться другому без проверки диапазона. Что­бы разрешить выполнять над\n";
echo "переменными tiny обычные целые операции, определяется tiny::operator int(),\n";
echo "неявное преобра­зование из tiny в int. Всегда, когда в том месте, где требу­ется\n";
echo "int, появляется tiny, используется соответствующее ему int. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>tiny c1         = 2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>tiny c2         = 62;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>tiny c3         = c2 - c1; // c3 = 60</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>tiny c4         =\n";
echo "c3; // нет проверки диапазона (необязательна)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int i =           c1 + c2; // i = 64</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>c1 = c2        +\n";
echo "2 * c1; // ошибка диапазона: c1 = 0 (а не 66)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>c2 = c1        -i;\n";
echo "// ошибка диапазона: c2 = 0</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>c3 = c2; //\n";
echo "нет проверки диапазона (необязательна)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Тип вектор из tiny может оказаться более полезным,\n";
echo "пос­кольку он экономит пространство. Чтобы сделать этот тип более удобным в\n";
echo "обращении, можно использовать операцию индексирова­ния.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Другое применение определяемых операций преобразования -\n";
echo "это типы, которые предоставляют нестандартные представления чисел (арифметика\n";
echo "по основанию 100, арифметика, арифметика с фиксированной точкой,\n";
echo "двоично-десятичное представление и т.п.). При этом обычно переопределяются такие\n";
echo "операции, как + и *.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Функции преобразования оказываются особенно полезными для\n";
echo "работы со структурами данных, когда чтение (реализованное посредством операции\n";
echo "преобразования) тривиально, в то время как присваивание и инициализация заметно\n";
echo "более сложны.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Типы istream и ostream опираются на функцию преобразова­ния, чтобы\n";
echo "сделать возможными такие операторы, как</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>while\n";
echo "(cin&gt;&gt;x) cout&lt;&lt;x;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Действие ввода cin&gt;&gt;x выше возвращает\n";
echo "istream&amp;. Это зна­чение неявно преобразуется к значению, которое указывает\n";
echo "сос­тояние cin, а уже это значение может проверяться оператором while (см.\n";
echo "#8.4.2). Однако определять преобразование из оного типа в другой так, что при\n";
echo "этом теряется информация, обычно не стоит.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968026\">6.3.3 Неоднозначности</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Присваивание объекту (или инициализация объекта) класса\n";
echo "X является допустимым, если или присваиваемое значение явля­ется X, или\n";
echo "существует единственное преобразование присваива­емого значения в тип X.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В некоторых случаях значение нужного типа может\n";
echo "быть построено с помощью нескольких применений конструкторов или операций\n";
echo "преобразования. Это должно делаться явно; допустим только один уровень неявных\n";
echo "преобразований, определенных пользователем. Иногда значение нужного типа может\n";
echo "быть пост­роено более чем одним способом. Такие случаи являются недо­пустимыми.\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>class x (* /*\n";
echo "... <span lang=EN-US>*/ x(int); x(char*); *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class y (* /* ... */ y(int); *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class z (* /*\n";
echo "... */ z(x); *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>overload f;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>x f(x);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>y f(y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>z g(z);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>f(1); //\n";
echo "недопустимо: неоднозначность f(x(1)) или</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>f(y(1))</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>f(x(1));</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>f(y(1));</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>g(&quot;asdf&quot;);\n";
echo "// недопустимо: g(z(x(&quot;asdf&quot;))) не пробуется</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>g(z(&quot;asdf&quot;));</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Определяемые пользователем преобразования\n";
echo "рассматривают­ся только в том случае, если без них вызов разрешить нельзя.\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>class x (* /*\n";
echo "... <span lang=EN-US>*/ x(int); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>overload h(double), h(x);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>h(1);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>Вызов мог              бы          быть  \n";
echo "проинтерпретирован   или   как</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>h(double(1)),\n";
echo "или как h(x(1)), и был бы недопустим по правилу</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>единственности.\n";
echo "Но                  первая  интерпретация использует только</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>стандартное\n";
echo "преобразование и она будет выбрана  по  правилам,</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>приведенным в #4.6.7.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Правила преобразования не являются ни самыми\n";
echo "простыми для реализации и документации, ни наиболее общими из тех, ко­торые\n";
echo "можно было бы разработать. Возьмем требование единс­твенности преобразования.\n";
echo "Более общий подход разрешил бы ком­пилятору применять любое преобразование,\n";
echo "которое он сможет найти; таким образом, не нужно было бы рассматривать все воз­можные\n";
echo "преобразования перед тем, как объявить выражение до­пустимым. К сожалению, это\n";
echo "означало бы, что смысл программы зависит от того, какое преобразование было\n";
echo "найдено. В резуль­тате смысл программы неким образом зависел бы от порядка опи­сания\n";
echo "преобразований. Поскольку они часто находятся в разных исходных файлах\n";
echo "(написанных разными людьми), смысл программы будет зависеть от порядка\n";
echo "компоновки этих частей вместе. Есть другой вариант - запретить все неявные\n";
echo "преобразования. Нет ничего проще, но такое правило приведет либо к неэлегантным\n";
echo "пользовательским интерфейсам, либо к бурному росту перегру­женных функций, как\n";
echo "это было в предыдущем разделе с complex.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:13.2pt;text-autospace:\n";
echo "none'>Самый общий подход учитывал бы всю имеющуюся информацию о типах и\n";
echo "рассматривал бы все возможные преобразования. Напри­мер, если использовать\n";
echo "предыдущее описание, то можно было бы обработать aa=f(1), так как тип aa\n";
echo "определяет единственность толкования. Если aa является x, то единственное,\n";
echo "дающее в ре­зультате x, который требуется присваиванием, - это f(x(1)), а если\n";
echo "aa - это y, то вместоэтого будет использоваться f(y(1)). Самый общий подход\n";
echo "справился бы и с g(&quot;asdf&quot;), поскольку еди­нственной интерпретацией\n";
echo "этого может быть g(z(x(&quot;asdf&quot;))). Сложность этого подхода в том, что\n";
echo "он требует расширенного а­нализа всего выражения для того, чтобы определить\n";
echo "интерпрета­цию каждой операции и вызова функции. Это приведет к замедле­нию\n";
echo "компиляции, а также к вызывающим удивление интерпретация­м и сообщениям об\n";
echo "ошибках, если компилятор рассмотрит преоб­разования, определенные в библиотеках\n";
echo "и т.п. При таком подхо­де компилятор будет принимать во внимание больше, чем,\n";
echo "как можно ожидать, знает пишущий программу программист!</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968027\">6.4 Константы</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Константы классового типа определить невозможно в\n";
echo "том смысле, в каком 1.2 и 12e являются константами типа double. Вместо них,\n";
echo "однако, часто можно использовать константы основ­ных типов, если их реализация\n";
echo "обеспечивается с помощью функ­ций членов. Общий аппарат для этого дают\n";
echo "конструкторы, полу­чающие один параметр. Когда конструкторы просты и\n";
echo "подставляются inline, имеет смысл рассмотреть в качестве константы вызов\n";
echo "конструктора. Если, например, в &lt;comlpex.h&gt; есть описание класса comlpex,\n";
echo "то выражение zz1*3+zz2*comlpex(1,2) даст два вызова функций, а не пять. К двум\n";
echo "вызовам функций приведут две операции *, а операция + и конструктор, к которому\n";
echo "обращаются для создания comlpex(3) и comlpex(1,2), будут расширены inline.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968028\">6.5 Большие Объекты</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>При каждом применении для comlpex бинарных\n";
echo "операций, описанных выше, в функцию, которая реализует операцию, как параметр\n";
echo "передается копия каждого операнда. Расходы на копи­рование каждого double\n";
echo "заметны, но с ними вполне можно прими­риться. К сожалению, не все классы имеют\n";
echo "небольшое и удобное представление. Чтобы избежать ненужного копирования, можно\n";
echo "описать функции таким образом, чтобы они получали ссылочные параметры. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class matrix (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double m[4][4];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>matrix();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend matrix operator+(matrix&amp;, matrix&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend matrix operator*(matrix&amp;, matrix&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>Ссылки\n";
echo "позволяют  использовать  выражения,                               содержащие</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>обычные\n";
echo "арифметические  операции над большими объектами,  без</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>ненужного\n";
echo "копирования. Указатели применять нельзя, потому что</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-autospace:\n";
echo "none'>невозможно для применения к указателю смысл операции переоп­ределить\n";
echo "невозможно. Операцию плюс можно определить так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>matrix operator+(matrix&amp;, matrix&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>matrix sum;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i=0; i&lt;4; i++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int j=0; j&lt;4; j++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-indent:52.8pt;text-autospace:\n";
echo "none'><span lang=EN-US>sum.m[i][j] = arg1.m[i][j] + arg2.m[i][j]; return sum;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Эта operator+() обращается к операндам + через\n";
echo "ссылки, но возвращает значение объекта. Возврат ссылки может оказать­ся более\n";
echo "эффективным:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class matrix (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend matrix&amp; operator+(matrix&amp;, matrix&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend matrix&amp; operator*(matrix&amp;, matrix&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это является допустимым, но приводит к сложности с\n";
echo "выде­лением памяти. Поскольку ссылка на результат будет переда­ваться из\n";
echo "функции как ссылка на возвращаемое значение, оно не может быть автоматической\n";
echo "переменной. Поскольку часто опера­ция используется в выражении больше одного\n";
echo "раза, результат не может быть и статической переменной. Как правило, его разме­щают\n";
echo "в свободной памяти. Часто копирование возвращаемого зна­чения оказывается\n";
echo "дешевле (по времени выполнения, объему кода и объему данных) и проще\n";
echo "программируется.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968029\">6.6 Присваивание и Инициализация</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Рассмотрим очень простой класс\n";
echo "строк string:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct string (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>int size; // размер вектора, на\n";
echo "который указывает p</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string(int sz) (* p = new char[size=sz]; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>~string() (* delete p; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Строка - это структура данных, состоящая из вектора сим­волов и длины\n";
echo "этого вектора. Вектор создается конструктором и уничтожается деструктором. \n";
echo "Однако, как показано в #5.10, это может привести к неприятностям. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void f()</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string s1(10);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string s2(20);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>s1 = s2;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>будет размещать два вектора символов, а\n";
echo "присваивание s1= s2 будет портить указатель на один из них и дублировать дру­гой.\n";
echo "На выходе из f() для s1 и s2 будет вызываться деструктор и уничтожать один и\n";
echo "тот же вектор с непредсказуемо разруши­тельными последствиями. Решение этой\n";
echo "проблемы состоит в том, чтобы соответствующим образом определить присваивание\n";
echo "объек­тов типа string:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct string (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>int size; // размер вектора, на\n";
echo "который указывает p</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string(int sz) (* p = new char[size=sz]; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>~string() (* delete p; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void operator=(string&amp;)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void string::operator=(string&amp; a)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (this == &amp;a) return; // </span>остерегаться<span lang=EN-US>\n";
echo "s=s;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p=new char[size=a.size];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strcpy(p,a.p);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это определение string гарантирует,и что предыдущий\n";
echo "при­мер будет работать как предполагалось. Однако небольшое изме­нение f()\n";
echo "приведет к появлению той же проблемы в новом облике:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string s1(10);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>s2 = s1;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Теперь создается только одна строка, а уничтожается\n";
echo "две. К неинициализированному объекту определяемая пользователем операция\n";
echo "присваивания не применяется. Беглый взгляд на string::operator=() объясняет,\n";
echo "почему было бы неразумно так делать: указатель p будет содержать неопределенное\n";
echo "и совер­шенно случайное значение. Часто операция присваивания полага­ется на\n";
echo "то, что ее аргументы инициализированы. Для такой ини­циализации, как здесь, это\n";
echo "не так по определению. Следовательно, нужно определить похожую, но другую,\n";
echo "функцию, чтобы обрабатывать инициализацию:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct string (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>int size; // размер вектора, на\n";
echo "который указывает p</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string(int sz) (* p = new char[size=sz]; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>~string() (* delete p; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void operator=(string&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string(string&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void string::string(string&amp; a)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p=new char[size=a.size];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strcpy(p,a.p);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Для типа X инициализацию тем же типом X\n";
echo "обрабатывает конструктор X(X&amp;). Нельзя не подчеркнуть еще раз, что присва­ивание\n";
echo "и инициализация - разные действия. Это особенно су­щественно при описании\n";
echo "деструктора. Если класс X имеет конс­труктор X(X&amp;), выполняющий\n";
echo "нетривиальную работу вроде освобождения памяти, то скорее всего потребуется\n";
echo "полный комп­лект функций, чтобы полностью избежать побитового копирования\n";
echo "объектов:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>class X (*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>X(something);                    //\n";
echo "конструктор: создает объект</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>X(&amp;X);                             //\n";
echo "конструктор: копирует в инициализации</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>operator=(X&amp;);  \n";
echo "// присваивание: чистит и копирует</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>~X();                                //\n";
echo "деструктор: чистит</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Есть еще два случая, когда объект копируется: как\n";
echo "пара­метр функции и как возвращаемое значение. Когда передается параметр,\n";
echo "инициализируется неинициализированная до этого пе­ременная - формальный\n";
echo "параметр. Семантика идентична семантике инициализации. То же самое происходит\n";
echo "при возврате из функ­ции, хотя это менее очевидно. В обоих случаях будет\n";
echo "применен X(X&amp;), если он определен:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string g(string arg)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return arg;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string s = &quot;asdf&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>s = g(s);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Ясно, что после вызова g() значение s обязано быть\n";
echo "&quot;asdf&quot;. Копирование значения s в параметр arg сложности не\n";
echo "представляет: для этого надо взывать string(string&amp;). Для взятия копии\n";
echo "этого значения из g() требуется еще один вызов string(string&amp;); на этот раз\n";
echo "инициализируемой является вре­менная переменная, которая затем присваивается s.\n";
echo "Такие пере­менные, естественно, уничтожаются как положено с помощью\n";
echo "string::~string() при первой возможности.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968030\">6.7 Индексирование</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы задать смысл индексов для объектов класса,\n";
echo "исполь­зуется функция operator[]. Второй параметр (индекс) функции operator[]\n";
echo "может быть любого типа. Это позволяет определять ассоциативные массивы и т.п. В\n";
echo "качестве примера давайте пере­пишем пример из #2.3.10, где при написании\n";
echo "небольшой програм­мы для подсчета числа вхождений слов в файле применялся ассо­циативный\n";
echo "массив. Там использовалась функция. Здесь определяется надлежащий тип\n";
echo "ассоциативного массива:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct pair (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* name;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int val;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class assoc (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pair* vec;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int max;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int free;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int&amp; operator[](char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_all();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В assoc хранится вектор пар pair длины max. Индекс\n";
echo "пер­вого неиспользованного элемента вектора находится в free. Конструктор\n";
echo "выглядит так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc::assoc(int s)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>max = (s&lt;16) ? s : 16;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>free = 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>vec = new pair[max];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>При реализации применяется все тот же простой и\n";
echo "неэффек­тивный метод поиска, что использовался в #2.3.10. Однако при\n";
echo "переполнении assoc увеличивается:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;string.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int assoc::operator[](char* p)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>/*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>работа с\n";
echo "множеством пар &quot;pair&quot;:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>поиск p,</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>возврат\n";
echo "ссылки на целую часть его &quot;pair&quot;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>делает новую\n";
echo "&quot;pair&quot;, если p не встречалось</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*/</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>register pair*\n";
echo "pp;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (pp=&amp;vec[free-1]; vec&lt;=pp; pp--)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-top:0cm;margin-right:10.55pt;\n";
echo "margin-bottom:13.3pt;margin-left:0cm;text-align:center;text-autospace:none'><span\n";
echo "lang=EN-US>if (strcmp(p,pp-&gt;name)==0) return pp-&gt;val;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>if\n";
echo "(free==max) (* // переполнение: вектор увеличивается</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pair* nvec = new pair[max*2];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for ( int i=0; i&lt;max; i++) nvec[i] = vec[i];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete vec;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>vec = nvec;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>max = 2*max;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pp = &amp;vec[free++];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pp-&gt;name = new char[strlen(p)+1];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strcpy(pp-&gt;name,p);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>pp-&gt;val =\n";
echo "0; // начальное значение: 0</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return pp-&gt;val;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Поскольку представление assoc скрыто, нам нужен\n";
echo "способ его печати. В следующем разделе будет показано, как опреде­лить\n";
echo "подходящий итератор, а здесь мы используем простую функ­цию печати:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>vouid assoc::print_all()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i = 0; i&lt;free; i++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:52.8pt;text-autospace:\n";
echo "none'><span lang=EN-US>cout &lt;&lt; vec[i].name &lt;&lt; &quot;: &quot;\n";
echo "&lt;&lt; vec[i].val &lt;&lt; &quot;\n&quot;; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Мы можем, наконец, написать\n";
echo "простую главную программу:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>main() //\n";
echo "считает вхождения каждого слова во вводе</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>const MAX =\n";
echo "256; // больше самого большого слова</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char buf[MAX];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc vec(512);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>while (cin&gt;&gt;buf) vec[buf]++;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>vec.print_all();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968031\">6.8 Вызов Функции</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Вызов функции, то есть запись\n";
echo "выражение(список_выраже­ний), можно проинтерпретировать как бинарную операцию,\n";
echo "и операцию вызова можно перегружать так же, как и другие опера­ции. Список\n";
echo "параметров функции operator() вычисляется и про­веряется в соответствие с\n";
echo "обычными правилами передачи пара­метров. Перегружающая функция может оказаться\n";
echo "полезной главным образом для определения типов с единственной операци­ей и для\n";
echo "типов, у которых одна операция настолько преоблада­ет, что другие в большинстве\n";
echo "ситуаций можно не принимать во внимание.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Для типа ассоциативного массива assoc мы не определили\n";
echo "итератор. Это можно сделать, определив класс assoc_iterator, работа которого\n";
echo "состоит в том, чтобы в определенном порядке поставлять элементы из assoc.\n";
echo "Итератору нужен доступ к дан­ным, которые хранятся в assoc, поэтому он сделан\n";
echo "другом:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class assoc (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend class assoc_iterator;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pair* vec;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int max;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int free;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int&amp; operator[](char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Итератор определяется как</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>class\n";
echo "assoc_iterator(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>assoc* cs; //\n";
echo "текущий массив assoc</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>int i; //\n";
echo "текущий индекс</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc_iterator(assoc&amp; s) (* cs = &amp;s; i = 0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pair* operator()()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:19.8pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>     (* return (i&lt;cs-&gt;free)? &amp;cs-&gt;vec[i++] : 0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Надо инициализировать assoc_iterator для массива\n";
echo "assoc, после чего он будет возвращать указатель на новую pair из этого массива\n";
echo "всякий раз, когда его будут активизировать опе­рацией (). По достижении конца\n";
echo "массива он возвращает 0:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>main() //\n";
echo "считает вхождения каждого слова во вводе</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>const MAX =\n";
echo "256; // больше самого большого слова</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char buf[MAX];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc vec(512);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>while (cin&gt;&gt;buf) vec[buf]++;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>assoc_iterator next(vec);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>pair* p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>while ( p = next() )</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>cout &lt;&lt; p-&gt;name &lt;&lt; &quot;:\n";
echo "&quot; &lt;&lt; p-&gt;val &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='text-autospace:none'>0             Итераторный тип\n";
echo "вроде этого имеет преимущество перед на-</p>\n";
echo "\n";
echo "<p class=MsoNormal style='text-autospace:none'>бором функций,  которые\n";
echo "выполняют ту же работу:  у него  есть</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-autospace:\n";
echo "none'>собственные закрытые данные для хранения хода итерации. К то­му же обычно\n";
echo "существенно, чтобы одновременно могли работать много итераторов этого типа.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Конечно, такое применение объектов для представления\n";
echo "итераторов никак особенно с перегрузкой операций не связано. Многие любят\n";
echo "использовать итераторы с такими операциями, как first(), next() и last()\n";
echo "(первый, следующий и последний).</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968032\">6.9 Класс String</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Вот довольно реалистичный пример класса строк\n";
echo "string. В нем производится учет ссылок на строку с целью минимизировать\n";
echo "копирование и в качестве констант применяются стандартные символьные строки\n";
echo "С++.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;string.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class string (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct srep (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>char* s;                      //\n";
echo "указатель на данные</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>int n;                          //\n";
echo "счетчик ссылок</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "26.6pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>srep *p; </span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:6.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string(char *);   // string x = &quot;abc&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string();                                // string x;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string(string &amp;); // string x = string ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string&amp; operator=(char *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string&amp; operator=(string &amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>~string();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>char&amp;\n";
echo "operator[](int i);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend ostream&amp; operator&lt;&lt;(ostream&amp;, string&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>friend\n";
echo "istream&amp; operator&gt;&gt;(istream&amp;, string&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend int operator==(string&amp; x, char* s)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:19.8pt;text-autospace:none'><span lang=EN-US>     (*return\n";
echo "strcmp(x.p-&gt;s, s) == 0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend int operator==(string&amp; x, string&amp; y)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:19.8pt;text-autospace:none'><span lang=EN-US>     (*return\n";
echo "strcmp(x.p-&gt;s, y.p-&gt;s) == 0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend int operator!=(string&amp; x, char* s)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:19.8pt;text-autospace:none'><span lang=EN-US>     (*return\n";
echo "strcmp(x.p-&gt;s, s) != 0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend int operator!=(string&amp; x, string&amp; y)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:19.8pt;text-autospace:none'><span lang=EN-US>     (*return\n";
echo "strcmp(x.p-&gt;s, y.p-&gt;s) != 0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Конструкторы и деструкторы\n";
echo "просты (как обычно):</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string::string()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p = new srep;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;s = 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;n = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string::string(char* s)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p = new srep;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;s = new char[ strlen(s)+1 ];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strcpy(p-&gt;s, s);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;n = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string::string(string&amp; x)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>x.p-&gt;n++;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p = x.p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string::~string()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (--p-&gt;n == 0) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete p-&gt;s;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>delete p;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Как обычно, операции присваивания очень похожи на\n";
echo "конс­трукторы. Они должны обрабатывать очистку своего первого (ле­вого)\n";
echo "операнда:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string&amp; string::operator=(char* s)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>if (p-&gt;n\n";
echo "&gt; 1) (* // разъединить себя</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;n--;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p = new srep;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else if (p-&gt;n == 1)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:66.0pt;text-autospace:none'><span lang=EN-US>delete p-&gt;s;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;s = new char[ strlen(s)+1 ];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strcpy(p-&gt;s, s);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p-&gt;n = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return *this;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Благоразумно обеспечить, чтобы присваивание объекта\n";
echo "са­мому себе работало правильно:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string&amp; string::operator=(string&amp; x)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>x.p-&gt;n++;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (--p-&gt;n == 0) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete p-&gt;s;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p = x.p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>return *this;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Операция вывода задумана так, чтобы\n";
echo "продемонстрировать применение учета ссылок. Она повторяет каждую вводимую\n";
echo "строку (с помощью операции &lt;&lt;, которая определяется позднее):</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ostream&amp; operator&lt;&lt;(ostream&amp; s, string&amp; x)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return s &lt;&lt; x.p-&gt;s &lt;&lt; &quot; [&quot; &lt;&lt;\n";
echo "x.p-&gt;n &lt;&lt; &quot;]\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Операция ввода использует стандартную функцию ввода сим­вольной строки\n";
echo "(#8.4.1).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>istream&amp; operator&gt;&gt;(istream&amp; s, string&amp; x)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char buf[256];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>s &gt;&gt; buf;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>x = buf;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;echo: &quot; &lt;&lt; x &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>return s;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Для доступа к отдельным символам предоставлена\n";
echo "операция индексирования. Осуществляется проверка индекса:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void error(char* p)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cerr &lt;&lt; p &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>exit(1);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char&amp; string::operator[](int i)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (i&lt;0 !! strlen(p-&gt;s)&lt;i) error(&quot;</span>индекс за границами<span\n";
echo "lang=EN-US>&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return p-&gt;s[i];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Головная программа просто немного опробует действия\n";
echo "над строками. Она читает слова со ввода в строки, а потом эти строки печатает.\n";
echo "Она продолжает это делать до тех пор, пока не распознает строку done, которая\n";
echo "завершает сохранение слов в строках, или пока не встретит конец файла. После\n";
echo "этого она печатает строки в обратном порядке и завершается.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string x[100];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>int n;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>cout &lt;&lt;\n";
echo "&quot;отсюда начнем\n&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (n = 0; cin&gt;&gt;x[n]; n++) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>string y;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>if (n==100) error(&quot;</span>слишком много\n";
echo "строк<span lang=EN-US>&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; (y = x[n]);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (y==&quot;done&quot;) break;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>cout &lt;&lt;\n";
echo "&quot;отсюда мы пройдем обратно\n&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i=n-1; 0&lt;=i; i--) cout &lt;&lt; x[i];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968033\">6.10 Друзья и Члены</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Теперь, наконец, можно обсудить, в каких случаях\n";
echo "для доступа к закрытой части определяемого пользователем типа ис­пользовать\n";
echo "члены, а в каких - друзей. Некоторые операции должны быть членами:\n";
echo "конструкторы, деструкторы и виртуальные функции (см. следующую главу), но\n";
echo "обычно это зависит от выбо­ра.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Рассмотрим простой класс X:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class X (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:242.85pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>X(int); int m(); friend int f(X&amp;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:242.85pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Внешне не видно никаких причин делать f(X&amp;)\n";
echo "другом до­полнительно к члену X::m() (или наоборот), чтобы реализовать действия\n";
echo "над классом X. Однако член X::m() можно вызывать только для &quot;настоящего\n";
echo "объекта&quot;, в то время как друг f() мо­жет вызываться для объекта,\n";
echo "созданного с помощью неявного преобразования типа. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void g()</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:211.2pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>1.m(); //\n";
echo "ошибка f(1); // f(x(1));</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:211.2pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Поэтому операция, изменяющая состояние объекта,\n";
echo "должна быть членом, а не другом. Для определяемых пользователем ти­пов\n";
echo "операции, требующие в случае фундаментальных типов опе­ранд lvalue (=, *=, ++,\n";
echo "*= и т.д.), наиболее естественно оп­ределяются как члены.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>И наоборот, если нужно иметь неявное преобразование для\n";
echo "всех операндов операции, то реализующая ее функция должна быть другом, а не\n";
echo "членом. Это часто имеет место для функций, которые реализуют операции, не\n";
echo "требующие при применении к фундаментальным типам lvalue в качестве операндов\n";
echo "(+, -, !! и т.д.).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Если никакие преобразования типа не определены, то ока­зывается,\n";
echo "что нет никаких существенных оснований в пользу члена, если есть друг, который\n";
echo "получает ссылочный параметр, и наоборот. В некоторых случаях программист может\n";
echo "предпочитать один синтаксис вызова другому. Например, оказывается, что\n";
echo "большинство предпочитает для обращения матрицы m запись m.inv (). Конечно, если\n";
echo "inv() действительно обращает матрицу m, а не просто возвращает новую матрицу,\n";
echo "обратную m, ей следует быть членом.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>При прочих равных условиях выбирайте, чтобы функция была\n";
echo "членом: никто не знает, вдруг когда-нибудь кто-то определит операцию\n";
echo "преобразования. Невозможно предсказать, потребуют ли будущие изменения изменять\n";
echo "состояние объекта. Синтаксис вызо­ва функции члена ясно указывает пользователю,\n";
echo "что объект мож­но изменить; ссылочный параметр является далеко не столь оче­видным.\n";
echo "Кроме того, выражения в члене могут быть заметно короче выражений в друге. В\n";
echo "функции друге надо использовать явный параметр, тогда как в члене можно\n";
echo "использовать неявный this. Если только не применяется перегрузка, имена членов\n";
echo "обычно короче имен друзей.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968034\">6.11 Предостережение</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Как и большую часть возможностей в языках\n";
echo "программирова­ния, перегрузку операций можно использовать как правильно, так и\n";
echo "неправильно. В частности, можно так воспользоваться возможностью определять\n";
echo "новые значения старых операций, что они станут почти совсем непостижимы.\n";
echo "Представьте, например, с какими сложностями столкнется человек, читающий\n";
echo "программу, в которой операция + была переопределена для обозначения вычи­тания.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Изложенный аппарат должен уберечь программиста/читателя от\n";
echo "худших крайностей применения перегрузки, потому что прог­раммист предохранен от\n";
echo "изменения значения операций для основ­ных типов данных вроде int, а также\n";
echo "потому, что синтаксис вы­ражений и приоритеты операций сохраняются.</p>\n";
echo "\n";
echo "<p class=MsoBodyText style='margin-top:13.3pt'>Может быть, разумно   применять \n";
echo "перегрузку  операций главным образом так, чтобы подражать общепринятому\n";
echo "применению операций. В  тех случаях, когда нет общепринятой операции или\n";
echo "имеющееся в С++ множество операций не подходит  для  имитации общепринятого\n";
echo "применения,      можно использовать запись вызова функции.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968035\">6.12 Упражнения</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>1. (*2) Определите итератор для класса string.\n";
echo "Определите операцию конкатенации + и операцию &quot;добавить в конец&quot; +=.\n";
echo "Какие еще операции над string вы хотели бы иметь возможность осуществлять?</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>2. (*1.5) Задайте с помощью перегрузки () операцию\n";
echo "выделе­ния подстроки для класса строк.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>3. (*3) Постройте класс string так, чтобы операция\n";
echo "выделе­ния подстроки могла использоваться в левой части присва­ивания. Напишите\n";
echo "сначала версию, в которой строка может присваиваться подстроке той же длины, а\n";
echo "потом версию, где эти длины могут быть разными.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>4. (*2) Постройте класс string так, чтобы для\n";
echo "присваивания, передачи параметров и т.п. он имел семантику по значе­нию, то\n";
echo "есть, когда копируется строковое представление, а не просто управляющая\n";
echo "структура данных класса sring.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>5. (*3) Модифицируйте класс string из предыдущего\n";
echo "примера таким образом, чтобы строка копировалась только когда это необходимо.\n";
echo "То есть, храните совместно используемое представление двух строк, пока одна из\n";
echo "этих строк не бу­дет изменена. Не пытайтесь одновременно с этим иметь операцию\n";
echo "выделения подстроки, которая может использо­ваться в левой части.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>6. (*4) Разработайте класс string с семантикой по\n";
echo "значению, копированием с задержкой и операцией подстроки, которая может стоять\n";
echo "в левой части.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>7. (*2) Какие преобразования используются в каждом\n";
echo "выраже­нии следующей программы:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct X (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int i;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>X(int); operator+(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct Y (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int i;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>Y(X); operator+(X); operator int();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "13.3pt;margin-left:46.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>X operator* (X,Y); int f(X);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:200.6pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>X x = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:242.85pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>Y y = x; int i = 2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:242.85pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:242.85pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:242.85pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>i    +   10;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:242.85pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>y   +   10;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>y   +   10 * y;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>x   +   y + i;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>x   *   x + i;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>f(7);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>f(y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>y + y;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:66.0pt;text-autospace:none'><span\n";
echo "lang=EN-US>106 + y;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:13.3pt;\n";
echo "margin-left:46.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-autospace:\n";
echo "none'>Определите X и Y так, чтобы они оба были целыми типами. Измените\n";
echo "программу так, чтобы она работала и печатала значения всех допустимых\n";
echo "выражений.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-indent:-19.8pt;text-autospace:\n";
echo "none'>8. (*2) Определите класс INT, который ведет себя в точности как int.\n";
echo "Подсказка: определите INT::operator int().</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>9. (*1) Определите класс RINT, который ведет себя\n";
echo "в точнос­ти как int за исключением того, что единственные возмож­ные операции -\n";
echo "это + (унарный и бинарный), - (унарный и бинарный), *, /, %. Подсказка: не\n";
echo "определяйте INT::operator int().</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>10.(*3) Определите класс LINT, ведущий себя как\n";
echo "RINT, за исключением того, что имеет точность не менее 64 бит.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>11.(*4) Определите класс, который реализует\n";
echo "арифметику с произвольной точностью. Подсказка: вам надо управлять памятью\n";
echo "аналогично тому, как это делалось для класса string.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>12.(*2) Напишите программу, доведенную до\n";
echo "нечитаемого сос­тояния с помощью макросов и перегрузки операций. Вот идея:\n";
echo "определите для INT + так, чтобы он означал -, и наоборот, а потом с помощью\n";
echo "макроопределения определите int как INT. Переопределение часто употребляемых\n";
echo "функ­ций, использование параметров ссылочного типа и несколь­ко вводящих в\n";
echo "заблуждение комментариев помогут устроить полную неразбериху.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>13.(*3) Поменяйтесь со своим другом программами,\n";
echo "которые у вас получились в предыдущем упражнении. Не запуская ее попытайтесь\n";
echo "понять, что делает программа вашего друга. После выполнения этого упражнения вы\n";
echo "будете знать, чего следует избегать.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>14.(*2)\n";
echo "Перепишите  примеры  с  comlpex   (#6.3.1),                                              tiny</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>(#6.3.2) и  \n";
echo "string (#6.9)  не используя friend функций.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-autospace:\n";
echo "none'>Используйте только функции члены. Протестируйте каждую из новых версий.\n";
echo "Сравните их с версиями, в которых ис­пользуются функции друзья. Еще раз\n";
echo "посмотрите Упражнение</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>5.3.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>15.(*2) Определите тип vec4 как вектор их четырех\n";
echo "float. Определите operator[] для vec4. Определите операции +, -, *, /, =, +=,\n";
echo "-=, *=, /= для сочетаний векторов и чи­сел с плавающей точкой.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>16.(*3) Определите класс mat4 как вектор из\n";
echo "четырех vec4. Определите для mat4 operator[], возвращающий vec4. Опре­делите\n";
echo "для этого типа обычные операции над матрицами. Определите функцию, выполняющие\n";
echo "для mat4 исключение Га­усса.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>17.(*2) Определите класс vector, аналогичный vec4,\n";
echo "но с длиной, которая задается как параметр конструктора vector::vector(int).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>18.(*3) Определите класс matrix, аналогичный mat4,\n";
echo "но с размерностью, задаваемой параметрами конструктора matrix::matrix(int,int).</p>\n";
echo "\n";
?>
