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

14.5. Перевантаження оператора "()"

Можливо, найбільш інтригуючим оператором, якого можна перевантажувати, є оператор "()" (оператор виклику функцій). Під час його перевантаження створюється не новий спосіб виклику функцій, а операторна функція, якій можна передати довільну кількість параметрів. Почнемо з такого прикладу. Припустимо, що певний клас містить наведене нижче оголошення перевантаженої операторної функції:

int operator()(float f, char *p);

І якщо у програмі створюється об'єкт obj цього класу, то настанова

obj(99.57, "перевантаження");

перетвориться в такий виклик операторної функції operator():

operator()(99.57, "перевантаження");

У загальному випадку під час перевантаження оператора "()" визначаються параметри, які необхідно передати функції operator(). Під час використання оператора "()" у програмі задані аргументи копіюються в ці параметри. Як завжди, об'єкт, який генерує виклик операторної функції (obj у наведеному прикладі), адресується покажчиком this.

Розглянемо приклад перевантаження оператора "()" для класу kooClass. Тут створюється новий об'єкт класу kooClass, координати якого є результати підсумовування відповідних значень координат об'єкта і значень, що передаються як аргументи.

Код програми 14.12. Демонстрація механізму перевантаження оператора "()"

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

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

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

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

public:

kooClass() { x = y = z = 0;}

kooClass(int izm, int jzm, int kzm) {x = izm; y = jzm; z = kzm;}

kooClass operator()(int a, int b, int c);

void showRez(char *s);

};

// Перевантаження оператора "()".

kooClass kooClass::operator()(int a, int b, int c)

{

kooClass tmp; // Створення тимчасового об'єкта

tmp.x = x + а;

tmp.y = y + b;

tmp.z = z + c;

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

}

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

void kooClass::showRez(char *s)

{

cout << "Координати об'єкта <" << s << ">:\n";

cout << "\tx= " << x << ", y= " << y << ", z= " << z << "\n";

}

int main()

{

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

B_ob = A_ob(10, 11, 12); // Виклик функції operator()

cout << "A_ob: ";

A_ob.showRez();

cout << "B_ob: ";

B_ob.showRez();

getch(); return 0;

}

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

A_ob: 1, 2, 3

B_ob: 11, 13, 15

Не забувайте, що під час перевантаження оператора "()" можна використовувати параметри будь-якого типу, та і сама операторна функція operator() може повертати значення будь-якого типу. Вибір типу повинен диктуватися потребами конкретних програм.

14.6. Перевантаження інших операторів

За винятком таких операторів, як new, delete, ->, ->* і "кома", решту С++-оператори можна перевантажувати таким самим способом, як було показано в попередніх прикладах. Перевантаження операторів new і delete вимагає застосування спеціальних методів, повний опис яких наведено в розд. 18 (він присвячений обробленню виняткових ситуацій). Оператори ->, ->* і "кома" – це спеціальні оператори, детальний перегляд яких виходить за рамки цього навчального посібника. Читачі, яких цікавлять інші приклади перевантаження операторів, можуть звернутися до такої книги [27].