Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

19.3. Перевантаження операторів введення-виведення даних

У розглянутих раніше прикладах програм для виконання операції введення або виведення "класових" даних створювалися функції-члени класів, призначення яких полягало тільки у тому, щоб ввести або вивести ці дані. Незважаючи на те, що у такому вирішенні цих питань немає нічого неправильного, проте у мові програмування C++ передбачено вдаліший спосіб виконання операцій введення-виведення даних "класових" даних – шляхом перевантаження операторів введення-виведення даних "<<" і ">>".

Оператор "<<" виводить інформацію у потік, а оператор ">>" вводить інформацію з потоку.

У мові C++ оператор "<<" називається оператором виведення або вставки, оскільки він вставляє символи у потік. Аналогічно оператор ">>" називається оператором введення або вилучення, оскільки він вилучає символи з потоку.

Як уже зазначалося вище, оператори введення-виведення вже перевантажені| (у заголовку <iostream>) для того, щоб вони могли виконувати операції потокового введення або виведення даних будь-яких вбудованих С++-типів. У цьому підрозділі можна буде дізнатися про те, як визначити ці оператори для створення власних класів.

19.3.1. Створення перевантажених операторів виведення даних

Як простий приклад розглянемо механізм створення оператора виведення даних для уже відомої нам з попередніх розділів (див. поч. у розд. 14.1) такої версії класу kooClass:

class kooClass { // Оголошення класового типу

public:

int x, y, z; // Тривимірні координати

kooClass(int a, int b, int c) { x = a; y = b; z = c;}

};

Щоб створити операторну функцію виведення даних для об'єктів типу kooClass, необхідно перевантажити оператор виведення даних "<<". Один з можливих способів його реалізації має такий вигляд:

// Відображення тривимірних координат x, y, z

// Перевантажений оператор виведення даних для класу kooClass

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

{

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

stream << obj.y << ", ";

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

return stream; // Повертає посилання на параметр stream

}

Розглянемо уважно цю операторну функцію, оскільки її вміст характерний для багатьох операторних функцій виведення даних. По-перше, зверніть увагу на те, що, згідно з оголошенням, вона повертає посилання на об'єкт типу ostream. Це дає змогу декілька звичайних операторів виведення даних об'єднати в одному складеному виразі. По-друге, зверніть увагу також на те, що ця функція має два параметри. Перший є посиланням на потік, який використовується в лівій частині оператора "<<". Другим є об'єкт, який знаходиться у правій частині цього оператора1. Саме тіло операторної функції складається з настанов виведення трьох значень координат, що містяться в об'єкті типу kooClass, і настанови повернення потоку stream. Нижче наведено коротку програму, у якій продемонстровано механізм використання перевантаженого оператора виведення даних.

Код програми 19.1. Демонстрація механізму реалізації перевантаженого оператора виведення даних

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class kooClass { // Оголошення класового типу

public:

int x, y, z; // Тривимірні координати

kooClass(int a, int b, int c) { x = a; y = b; z = c;}

};

// Відображення тривимірних координат x, y, z

// Перевантажений оператор виведення даних для класу kooClass

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

{

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

stream << obj.y << ", ";

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

return stream; // Повертає посилання на параметр stream

}

int main()

{

kooClass A_ob(1, 2, 3), B_ob(3, 4, 5), C_ob(5, 6, 7);

// Перевантажений оператор виведення даних

cout << A_ob << B_ob << C_ob;

getch(); return 0;

}

У процесі виконання ця програма виводить на монітор такі результати:

1, 2, 3

3, 4, 5

5, 6, 7

Якщо видалити програмний код, що стосується звичайних операторів виведення даних конкретного класу kooClass, то залишиться "скелет", що відповідає будь-якій операторній функції виведення даних:

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

{

// Код операторної функції виведення даних

return stream; // Повертає посилання на параметр stream

}

Як вже наголошувалося вище, для параметра obj дозволяється використовувати посилання для його передачі.

Загалом конкретні дії, які має виконувати операторна функція виведення даних, визначаються програмістом. Але, якщо у Вас виникає бажання дотримуватися професійного стилю програмування, то створена програмістом операторна функція виведення даних повинна тільки виводити інформацію. І потім, завжди незайве бути впевненому в тому, що вона повертає тільки параметр stream.

Перш ніж переходити до наступного розділу, подумайте, чому операторна функція виведення даних для класу kooClass не була запрограмована так:

// Версія обмеженого застосування (використанню не підлягає).

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

{

cout << obj.x << ", ";

cout << obj.y << ", ";

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

return stream; // Повертає посилання на параметр stream

}

Не важко здогадатися, що у такій версії операторної функції жорстко закодований потік cout. Це обмежує перелік ситуацій, в яких її можна використовувати.

Необхідно пам'ятати! Перевантажений оператор "<<" можна застосувати для виведення будь-якого потоку. Потік даних, який використовується у "<<"-виразі, передається параметру stream.

Отже, програміст повинен передавати операторній функції виведення даних потік, який коректно працює в усіх конкретних випадках. Тільки так можна створити досконалу операторну функцію виведення даних, яка підійде для використання в будь-яких виразах введення-виведення.