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

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

Для перевантаження операторів введення даних використовується аналогічний підхід, який було застосовано під час перевантаження операторів виведення даних. Наприклад, наведений нижче перевантажений оператор введення даних забезпечує введення тривимірних координат. Звернемо Вашу увагу на те, що він також виводить відповідне повідомлення для користувача.

// Прийняття тривимірних координат x, y, z

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

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

{

cout << "Введіть координати х, y і z: ";

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

stream >> obj.x >> obj.y >> obj.z;

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

}

Перевантажений оператор введення даних повинен повертати посилання на об'єкт типу istream. Окрім того, перший параметр повинен бути посиланням на об'єкт типу istream. Цей тип належить потоку, що вказується зліва від оператора ">>". Другий параметр є посиланням на об'єкт, який приймає значення, що вводяться. Оскільки другий параметр – посилання на об'єкт, то його можна модифікувати під час введення інформації.

Загальний формат перевантаженого оператора введення даних має такий вигляд:

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

{

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

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

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

}

Особливості використання операторних функцій введення та виведення даних для об'єктів типу kooClass продемонстровано в такій програмі.

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

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

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

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

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

public:

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

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

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

};

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

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

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

{

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

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

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

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

}

// Прийняття тривимірних координат x, y, z

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

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

{

cout << "Введіть координати x, y і z: ";

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

stream >> obj.x >> obj.y >> obj.z;

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

}

int main()

{

kooClass A_ob(1, 2, 3);

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

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

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

getch(); return 0;

}

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

1, 2, 3

Введіть координати x, y і z: 5 6 7

5, 6, 7

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

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

19.3.4. Порівняння С- і С++-систем введення-виведення

Як уже зазначалося вище, попередниця мови програмування C++, мова С оснащена однією з найгнучкіших (серед структурованих мов) і водночас дуже могутньою системою введення-виведення1. Однак виникає логічне запитання: чому ж тоді у мові програмування C++ визначається власна система введення-виведення, якщо в ній продубльована велика частина того, що міститься у мові С (маємо на увазі могутній набір С-функцій введення-виведення)? Відповісти на це запитання неважко. Йдеться про те, що С-система введення-виведення не забезпечує ніякої підтримки для об'єктів, що визначаються користувачем. Наприклад, якщо створити таку структуру

struct myStruct { // Оголошення типу структури

int count;

char sMas[80];

double balance;

} oust;,

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

Варто знати! Оскільки мова програмування C++ є надбудовою мови С, тому увесь вміст засобів С-системи введення-виведення включено у мову C++1. Тому у процесі перекладу С-програм на мову C++ програмісту не потрібно підряд змінювати усі настанови введення-виведення даних. Працюючі С-настанови скомпілюються і успішно працюватимуть у новому С++-середовищі. Просто програміст повинен врахувати те, що стара С-система введення-виведення не володіє об'єктно-орієн­това­ними можливостями.