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

Int mainO

{

kooClass 0bjA(1, 2, 3), 0bjB(3,4, 5), 0bjC(5,6, 7);

// Перевизначений оператор виведення даних cout « ObjA « ObjB « ObjC;

getchO; 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 « endl;

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

}

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

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

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

  1. Використання функцій-"друзів" класу для перевюначення операторів виведення даних

У попередній програмі операторну функцію виведення даних не було визна­чено як член класу kooClass. Насправді ні будь-яка операторна функція виведення даних, ні функція їх введення не можуть бути членами класу. Справа тут полягає ось в чому. Якщо операторна функція є членом класу, то лівий операнд (що опо­середковано передається за допомогою покажчика this) повинен бути об'єктом класу, який генерує звернення до цієї операторної функції. І це змінити не можна. Проте при перевизначенні операторів виведення даних лівий операнд повинен бу­ти потоком, а правий - об'єктом класу, дані якого підлягають виведенню. Отже, перевизначені оператори виведення даних не можуть бути функціями-членами класу.

У зв'язку з тим, що операторні функції виведення даних не можуть бути чле­нами класу, для якого вони визначаються, то виникає серйозне запитання: як пе- ревизначений оператор виведення даних може отримати доступ до закритих чле­нів класу? У попередній програмі (див. код програми 9.1) змінні х, у і z були виз­начені як відкриті, тому оператор виведення даних без перешкод міг отримати до них доступ. Водночас закриття даних - важлива частина об'єктно-орієнтованого програмування, отже, вимагати, щоб усі дані були відкритими, просто нелогічно. Проте існує просте вирішення цього питання - оператор виведення даних можна зробити "другом" класу. Якщо функція є "другом" деякого класу, то вона отримує легальний доступ до його private-даних. Оголошення "другом" класу операторної функції виведення даних продемонструємо на прикладі класу kooClass.

Код програми 9.2. Демонстрація механізму використання функцій-"друзів" класу для перевизначення оператора виведення даних #include <iostream> // Для потокового введення-виведення

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

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