§ 3. Перегрузка операций

3.2. Логический тип данных

Для стандартных типов данных таких как int или double ввод и вывод реализован через стандартные операторы >> и <<. Эти же операторы перегружены для ввода-вывода строк. Для пользовательских типов данных, имеющих множество полей, также можно перегрузить операторы ввода-вывода. Перегрузка операторов << и >> намного упрощает процесс вывода объекта на экран и получение пользовательского ввода с записью данных в объект класса.

Рассмотрим перегрузку оператора <<. Оператор является бинарным оператором, поэтому его перегрузка будет аналогична перегрузке оператора «+», рассмотренной в примерах 3.5 и 3.6. Левым операндом у оператора << является объект cout, а правым — объект класса, который нужно вывести. Переопределяемый оператор должен возвращать значение типа ostream, объектом которого является cout. Параметры, описываемой функции, должны быть ссылками (примеры 3.7 и 3.8). Также ссылкой должен быть и возвращаемый результат, поскольку ostream запрещает свое копирование.

Перегрузка оператора ввода происходит аналогично. Отличие в том, что cin является объектом типа istream (примеры 3.9 и 3.10). Ссылка на объект класса, являющийся вторым параметром, не может быть константой, поскольку объект изменяется при вводе.

После перезагрузки операторов ввода и вывода их можно использовать также  для чтения и записи файлов.

Пример 3.7. Перегрузка оператора вывода << для класса Vect, определенного в примере 3.5.

Объявление:

friend ostream & operator << 

(ostream &, const Vect &);

Описание:

ostream & operator << 

(ostream &out, const Vect &p)

{

  out << p.<< " " << p.<< endl;

}

Пример 3.8. Перегрузка оператора вывода << для класса Matrix, определенного в примере 3.6.

Объявление:

friend ostream & operator << 

(ostream &, const Matrix  &);

Описание:

ostream & operator << 

(ostream & out, const Matrix &d)

{

  for (int i = 0; i < d.n; i++){

    for (int j = 0; j < d.m; j++)

      out << setw(4) << d.data[i][j];

    out << endl;

  }

  out << endl;

Пример 3.9. Перегрузка оператора вывода >> для класса Vect, определенного в примере 3.5.

Объявление:

friend istream & operator >> 

(istream &, Vect &);

Описание:

span style="font-size: medium;">istream & operator >> 
(istream &in, Vect &p)

{

    in >> p.>> p.y;

}

Пример 3.10. Перегрузка оператора вывода >> для класса Matrix, определенного в примере 3.6.

Объявление:

friend istream & operator >> 

(istream &, Matrix &);

Описание:

istream & operator >> 

(istream & in, Matrix &d)

{

  for (int i = 0; i < d.n; i++)

    for (int j = 0; j < d.m; j++)

      in >> d.data[i][j];

}