С++ для начинающих



         

Перегрузка оператора вывода


Если мы хотим, чтобы наш тип класса поддерживал операции ввода/вывода, то необходимо перегрузить оба соответствующих оператора. В этом разделе мы рассмотрим, как перегружается оператор вывода. (Перегрузка оператора ввода – тема следующего раздела.) Например, для класса WordCount он выглядит так:

class WordCount {

    friend ostream&

           operator<<( ostream&, const WordCount& );

public:

    WordCount( string word, int cnt=1 );

    // ...

private:

    string word;

    int occurs;

};

ostream&

operator <<( ostream& os, const WordCount& wd )

{    // формат: <счетчик> слово

     os << "< " << " > " > "

        << wd.word;

     return os;

}

Проектировщик должен решить, следует ли выводить завершающий символ новой строки. Лучше этого не делать: поскольку операторы вывода для встроенных типов такой символ не печатают, пользователь ожидает аналогичного поведения и от операторов в других классах. Определенный нами в классе WordCount оператор вывода можно использовать вместе с любыми другими операторами:

#include <iostream>

#include "WordCount.h"

int main()

{

   WordCount wd( "sadness", 12 );

   cout << "wd:\n" << wd << endl;

   return 0;

}

Программа печатает на терминале строки:

wd:

<12> sadness

Оператор вывода – это бинарный оператор, который возвращает ссылку на объект класса ostream. В общем случае структура определения перегруженного оператора вывода выглядит так:

// структура перегруженного оператора вывода

ostream&

operator <<( ostream& os, const ClassType &object )

{

   // произвольный код для подготовки объекта

   // фактическое число членов

   os << // ...

   // возвращается объект ostream

   return os;

}

Первый его аргумент – это ссылка на объект ostream, а второй – ссылка (обычно константная) на объект некоторого класса. Возвращается ссылка на ostream. Значением всегда является объект ostream, для которого оператор вызывался.




Содержание  Назад  Вперед