three_d(int a, int b, int с) { x = a; у = b; z = c; }

  friend ostream &operator<<(ostream &stream, three_d obj);

};

// Отображение координат X, Y, Z (оператор вывода для класса three_d).

ostream &operator<<(ostream &stream, three_d obj)

{

 stream << obj.x << ", ";

 stream << obj.у << ", ";

 stream << obj.z << "\n";

 return stream; // возвращает поток

}

int main()

{

 three_d a(1, 2, 3), b(3, 4, 5), с (5, 6, 7);

 cout << a << b << c;

 return 0;

}

Обратите внимание на то, что переменные х, у и z в этой версии программы являются закрытыми в классе three_d, тем не менее, операторная функция вывода обращается к ним напрямую. Вот где проявляется великая сила "дружбы": объявляя операторные функции ввода и вывода "друзьями" класса, для которого они определяются, мы тем самым поддерживаем принцип инкапсуляции объектно-ориентированного программирования.

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

Для перегрузки операторов ввода используйте тот же метод, который мы применяли при перегрузке оператора вывода. Например, следующий оператор ввода обеспечивает ввод трехмерных координат. Обратите внимание на то, что он также выводит соответствующее сообщение для пользователя.

/* Прием трехмерных координат (оператор ввода для класса three_d).

*/

istream &operator>>(istream &stream, three_d &obj)

{

 cout << "Введите координаты X, Y и Z:

 stream >> obj.x >> obj.у >> obj.z;

 return stream;

}

Оператор ввода должен возвращать ссылку на объект типа istream. Кроме того, первый параметр должен представлять собой ссылку на объект типа istream. Этот тип принадлежит потоку, указанному слева от оператора ">>". Второй параметр является ссылкой на переменную, которая принимает вводимое значение. Поскольку второй параметр — ссылка, он может быть модифицирован при вводе информации.

Общий формат оператора ввода имеет следующий вид.

istream &operator>>(istream &stream, object_type &obj)

{

 // код операторной функции ввода данных

 return stream;

}

Использование функции ввода данных для объектов типа three_d демонстрируется в следующей программе.

// Использование перегруженного оператора ввода.

#include

using namespace std;

class three_d {

  int x, y, z; // 3-мерные координаты

 public:

  three_d(int a, int b, int с) { x = a; у = b; z = c; }

  friend ostream &operator<<(ostream &stream, three_d obj);

  friend istream &operator>>(istream &stream, three_d &obj);

};

// Отображение координат X, Y, Z (оператор вывода для класса three_d).

ostream &operator<<(ostream &stream, three_d obj)

{

 stream << obj.x << ", ";

 stream << obj.у << ", ";

 stream << obj.z << "\n";

 return stream; // возвращает параметр stream

}

// Прием трехмерных координат (оператор ввода для класса three_d).

istream &operator>>(istream &stream, three_d &obj)

{

 cout << "Введите координаты X, Y и Z: ";

 stream >> obj.x >> obj.у >> obj.z;

 return stream;

}

int main()

{

 three_d a(1, 2, 3);

 cout << a;

 cin >> a;

 cout << a;

 return 0;

}

Вот как выглядит один из возможных результатов выполнения этой программы.

1, 2, 3

Введите координаты X, Y и Z: 5 6 7

5, 6, 7

Подобно функциям вывода, функции ввода не должны быть членами класса, для обработки данных которого они предназначены. Они могут быть "друзьями" этого класса или просто независимыми функциями.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги