    Объявление operator= перегружает оператор присваивания, задавая 
константный ссылочный параметр сору типа TAnyClass. Параметр ссылается на 
копируемый объект. Другими словами, если а и b — объекты класса TAnyClass, в 
присваивании вида а = b параметр сору ссылается на b. Функция перегрузки 
оператора присваивания реализуется следующим образом: 

    void TAnyClass::operator=(const TAnyClass Acopy) 
    {
       cout « "\nlnside TAnyClass's operator* function; 
       if (this == &copy) 
         return; 
      delete s; 
      i = copy, i; 
      r = copy, r; 
      s = strdup(copy. s); 
   } 

    Как и ранее, оператор вывода — только лишь для отладки. В первом операторе 
if сравниваются скрытый указатель this и адрес ссылочного параметра сору. Это 
необходимо для предотвращения попытки присваивания объекта самому себе. 

Например, при попытке выполнить операторы 

    TAnyClass v1, v2; 
     v1 = v1; 

перегруженный оператор присваивания просто завершит свою работу без 
выполнения каких-либо действий. 
    Во втором операторе if освобождается участок памяти (если он выделен), 
адресованный указателем s. (Удаление нулевого указателя не является ошибкой, 
следовательно, отсутствует необходимость в проверке указателя s на равенство 
нулю перед применением оператора delete.) 
    Прочие присваивания в перегруженной функции аналогичны тем, что были 
представлены ранее в конструкторе копии. В следующем разделе поясняется, как 
избежать подобного дублирования кода, заставив конструктор копии работать 
сообща с перегруженным оператором присваивания. 

    Вызов operator= из конструктора копии 

    Вы можете легко устранить излишнее дублирование кода в конструкторе копии 
и перегруженном операторе присваивания. Внутри конструктора копии следует 
просто вызвать функцию перегрузки operator= присваиванием копируемого объекта 
объекту *this: 

    TAnyClass::TAnyClass(TAnyClass Scopy) 
    { 
       s = NULL;	  // Инициализировать имеющиеся указатели нулевыми значениями 
       *this = copy;          // Вызвать перегруженный оператор присваивания 
    } 

    Весьма важно инициализировать все члены (обычно указатели), которые 
проверяет перегруженный оператор присваивания. Например, если указатель 
содержит всякий мусор вместо NULL, функция перегрузки опеpaтора присваивания 
попытается освободить память, которая не была выделена. Излишне говорить, что 
в лом случае вас ожидают неприятности. 

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

    Форматирование вывода 

    В заголовочном файле IOSTREAM.H содержатся следующие объявления одного 
потока ввода и трех потоков вывода: 

    extern istream_withassign _Cdecl cin;   // Объект потока ввода 
    extern ostream_withassign _Cdecl cout; // Объект потока вывода 
    extern ostream_withassign _Cdecl cerr; // Объект потока вывода ошибок 
    ewtern ostream_withassign _Cdecl clog; // Объект буферизованного потока вывода ошибок 

    Кшассы istream_withassign и ostream_withassign в конечном счете выводятся 
из "прадедушки" классов потока ввода-вывода — ios. Вам не надо вникать во все 
детали реализации этих классов для того, чтобы использовать их в программах, однако, 
если вам интересно, в поставку Borland C++ входят полные и пространные файлы с 
исходными текстами реализации потоков ввода-вывода. 


    15. Передовые средства C++     385 
     Borland® C+ +4.5 
