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

21.11. Створення функцій перетворення

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

operator type() {return value;}

У цьому записі елемент type – новий тип, який є метою нашого перетворення, а елемент value – значення після перетворення. Функція перетворення повинна бути членом класу, для якого вона визначається.

Функція перетворення автоматично перетворить тип класу в інший тип.

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

operator int() { return x * y * z;}

Тепер розглянемо програму, яка ілюструє роботу функції перетворення.

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

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

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

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

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

public:

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

kooClass operator+(kooClass op2);

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

operator int() {return x * y * z;}

};

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

// для класу kooClass.

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

{

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

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

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

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

}

kooClass kooClass::operator+(kooClass op2)

{

kooClass tmp(0, 0, 0);

tmp.x = x + op2.x;

tmp.y = y + op2.y;

tmp.z = z + op2.z;

return tmp; // Повертає модифікований тимчасовий об'єкт

}

int main()

{

kooClass A_ob(1, 2, 3), A_ob(2, 3, 4);

cout << A_ob << A_ob;

cout << A_ob+100; // Відображає число 124, оскільки тут виконується

// перетворення об'єкта класу у значення типу int.

cout << "\n";

A_ob = A_ob + A_ob; // Додавання двох об'єктів класу kooClass

// Виконується без перетворення типу.

cout << A_ob; // Відображає координати 3, 5, 7

getch(); return 0;

}

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

1,2, 3

2, 3, 4

124

3, 5, 7

Як підтверджують результати виконання цієї програми, якщо в такому виразі цілочисельного типу, як cout << A_ob+100, використовується об'єкт типу kooClass, то до цього об'єкта застосовується функція перетворення. У цьому випадку функція перетворення повертає значення 24, яке потім бере участь в операції додавання з числом 100. Але коли у перетворенні немає потреби, наприклад, під час обчислення виразу A_ob = A_ob + A_ob, то функція перетворення не викликається.

Якщо функція перетворення створена, то вона викликатиметься скрізь, де потрібне перетворення, враховуючи ситуації, коли об'єкт передається функції як аргумент. Наприклад, якщо об'єкт класу kooClass передати стандартній функції abs(), то також буде викликано функцію, що виконує перетворення об'єкта типу kooClass у значення типу int, оскільки функція abs() повинна приймати аргумент цілочисельного типу.

Необхідно пам'ятати! Для різних ситуацій можна створювати різні функції перетворення. Наприклад, можна визначити функції, які перетворять об'єкти типу kooClass у значення типу double або long, при цьому створені функції будуть застосовуватися автоматично. Функції перетворення дають змогу інтегрувати нові типи класів, що створюються програмістом, у С++-середовище програмування.

Розділ 22. Введення в стандартну бібліотеку шаблонів

Матеріал цього розділу містить інформацію про те, яку багато хто з програмістів вважає найважливішим доповненням у мові програмування C++ за останні роки. Йдеться про стандартну бібліотеку шаблонів (Standard Template Library – STL). Саме внесення бібліотеки STL у мову програмування C++ було основною подією, яка наполегливо обговорювалася у період стандартизації мови C++. Бібліотека STL надає користувачу шаблонні класи і функції загального призначення, які реалізують багато популярних і часто використовуваних алгоритмів і структур даних. Наприклад, вона містить підтримку векторів, списків, черг і стеків, а також визначає різні функції, які забезпечують до них доступ. Оскільки бібліотека STL складається з шаблонних класів, то алгоритми і структури даних можна застосовувати до даних практично будь-якого типу.

Бібліотека STL – це набір шаблонних класів і функцій загального призначення.

Бібліотека STL – це результат розроблення стандартного програмного забезпечення, який увібрав у себе одні з найскладніших засобів мови програмування C++. Щоб розуміти вміст бібліотеки STL і уміти ним користуватися, необхідно досконало засвоїти весь матеріал, викладений у попередніх розділах. Особливо добре потрібно орієнтуватися в шаблонах. Відверто кажучи, шаблонний синтаксис, який використовує бібліотека STL, може спочатку налякати програмістів-початківців, хоча він виглядає дещо складнішим, ніж є насправді. Незважаючи на те, що матеріал цього розділу є не надто важчим за будь-який інший, наведений у цьому навчальному посібнику, проте не варто засмучуватися від того, якщо щось на перший погляд Вам видасться незрозумілим. Трохи терпіння під час перегляду прикладів і певної уваги у процесі їх детального аналізу приведе до того, що незабаром Ви зрозумієте, як за незвичним синтаксисом ховається строга простота бібліотеки STL.

STL – достатньо велика бібліотека, і всі її засоби неможливо викласти в одному розділі. Повний опис бібліотеки STL зі всіма її нюансами і методами програмування займає цілу книгу [2, 24, 31]. Мета представленого тут матеріалу – познайомити студентів з основними операціями, принципами проектування і основами STL-програмування. Засвоївши матеріал цього розділу, студент зможете самостійно легко вивчити іншу частину бібліотеки STL.

У цьому розділі також описано ще один важливий клас C++ – клас string. Він призначений для визначення рядкового типу даних, який дає змогу обробляти символьні рядки подібно до того, як обробляються дані інших типів: за допомогою операторів. Клас string тісно пов'язаний з бібліотекою STL.