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

Class kooClass {// Оголошення класового типу int х, у, z; // Тривимірні координати

public:

kooClass(int а, int b, int с) {х = а; у = b; z = с;}

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

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

};

// Відображення тривимірних координат x, у, z // Перевизначений оператор виведення даних для класу kooClass ostream &operator«(ostream &stream, kooClass obj)

{

stream « obj.x «", stream « obj.y «", stream « obj.z « endl;

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

}

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

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

Istream &operator»(istream &stream, kooClass &obj)

{

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

// Перевизначений оператор введення даних stream » obj.x » obj.y » obj.z;

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

}

Int mainO

{

kooClass ObjA(1, 2, 3);

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

сіп » ObjA; // Перевизначений оператор введення даних cout« ObjA; // Перевизначений оператор виведення даних getchO; return 0;

}

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

1,2,3

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

5,6,7

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

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

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

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

struct myStruct {// Оголошення типу структури int count; char str[80]; double balance;

} oust;,

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

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

  1. Форматне введення-виведення даних

Дотепер під час введення або виведення інформації в наведених вище прик­ладах програм діяли параметри форматування, які за замовчуванням використовує

С++-система введення-виведення. Але програміст може сам керувати форматом представлення даних, причому двома способами. Перший спосіб передбачає вико­ристання функцій-членів класу ios, а другий - функцій спеціального типу, що іме­нуються маніпуляторами (manipulator). У цьому підрозділі розглянемо основні можливості форматування даних, починаючи з функцій-членів класу ios, і завер­шуючи створенням власних маніпуляторних функцій.

  1. Форматування даних з використанням функцій-членів класу ios

У С++-системі введення-виведення кожен потік пов'язаний з набором опцій, які керують процесом форматування даних. У класі ios оголошують перерахунок fmtflags, у якому визначено стандартні значення опцій форматування2 (табл. 9.2).

Табл. 9.2. Стандартні С++-значення опцій форматування

adjustfield

floatfield

right

skipws

basefield

hex

scientific

unitbuf

boolalpha

internal

showbase

uppercase

dec

left

showpoint

fixed

oct

showpos


Ці значення використовують для встановлення або скидання опцій формату­вання за допомогою таких функцій: setfO і unsetf(). При використанні старого ком­пілятора може так статися, що він не зможе визначити тип перерахунку fmtflags. У цьому випадку опції форматування кодуватимуться як цілочисельні long-значення.

  1. Якщо опція skipws встановлена, то при потоковому введенні даних провідні "пропускні" символи, або символи пропуску (тобто пропуски, символи табуляції та нового рядка), відкидаються. Якщо ж опція skipws скинута, то пропускні сим­воли не відкидаються.

  2. Якщо встановлено опцію left, то дані, що виводяться, вирівнюються лівим краєм, а якщо встановлено опцію right - то правим краєм. Якщо встановлено опцію in­ternal, то числове значення доповнюється пропусками, якими заповнюється поле між ним і знаком числа або символом основи системи числення. Якщо жодну з цих опцій не встановлено, то результат вирівнюється правим краєм за замовчу­ванням.

  3. За замовчуванням числові значення виводяться у десятковій системі числення. Проте основу системи числення можна змінити. Встановлення опції oct приведе до виведення результату у вісімковому представленні, а встановлення опції hex - в шістнадцятковому. Щоб під час відображення результату повернутися до де­сяткової системи числення, достатньо встановити опцію dec.

  4. Встановлення опції showbase приводить до відображення позначення основи си­стеми числення, у якій представляються числові значення. Наприклад, якщо ви­користовується шістнадцяткове представлення, то значення 1F буде відображе­но як 0x1 F.

  5. За замовчуванням при використанні експоненціального представлення чисел ві­дображається рядковий варіант букви "е". Окрім цього, під час відображення шістнадцяткового значення використовують також рядкову букву "х". Після встановлення опції uppercase відображається прописний варіант цих символів.

  6. Встановлення опції showpos викликає відображення провідного знаку "плюс" перед позитивними значеннями.

  7. Встановлення опції showpoint приводить до відображення десяткової крапки і хвостових нулів для всіх чисел з плинною крапкою - потрібні вони чи ні.

  8. Після встановлення опції scientific числові значення з плинною крапкою відобра­жаються в експоненціальному представленні. Якщо встановлено опцію fixed, то дійсні значення відображаються у звичайному представленні. Якщо не встанов­лено жодну з цих опцій, то компілятор сам вибирає відповідний формат їх пред­ставлення.

  9. При встановленому опції unitbuf вміст буфера скидається на диск після кожної операції виведення даних.

  10. Якщо встановлено опцію boolalpha, то значення булевого типу можна вводити або виводити, використовуючи ключові слова true і false.

Оскільки часто доводиться звертатися до полів oct, dec і hex, то на них допус­кається колективне посилання ios::basefield. Аналогічно поля left, right і internal мож­на узагальнено назвати ios::adjustfield. Нарешті, поля scientific і fixed можна назвати ios::floatfield.

Для встановлення будь-якої опції використовується функція setf(), яка є чле­ном класу ios. Ось як виглядає її формат: fmtflags setf(fmtflags flags),

Ця функція повертає значення попередніх установок опцій форматування і встановлює їх відповідно до значення, які задаються параметром flags. Наприклад, щоб встановити опцію showbase, можна використовувати таку настанову: sfrea/7isetf(ios::showbase);

У цьому записі елемент stream означає потік, параметри форматування якого Ви хочете змінити. Зверніть увагу на використання префікса ios:: для уточнення належності параметра showbase. Оскільки параметр showbase представляє собою перерахункову константу, що визначається у класі ios, то під час звернення до неї необхідно вказувати ім'я класу ios. Цей принцип стосується всіх опцій формату­вання. У наведеному нижче коді програми функцію setfO використовують для встановлення опцій showpos і scientific.

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

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

int mainO

{

cout.setf(ios::showpos); // Відображення знаку"+" перед позитивним значенням cout.setf(ios:scientific); // Відображення чисел у експоненціальному вигляді cout «123«" "« 123.23«"";

getchO; return 0;

}

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

+123 +1,232300е+002

За допомогою операції АБО можна встановити відразу декілька потрібних опцій форматування в одному виклику функції setf(). Наприклад, наведену вище програму можна скоротити, об'єднавши за допомогою АБО опції scientific і show- pos, оскільки у цьому випадку буде виконуватися тільки одне звернення до фун­кції setfO:

// Відображення чисел у експоненціальному вигляді або знаку"+" перед позитивним значенням cout.setf(ios::scientific || ios::showpos);

Щоб скинути опцію, потрібно використовувати функцію unsetfO, прототип якої має такий вигляд: