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

Int х, у, z; //Тривимірні координати

public:

kooClassO {х = у = z = 0;}

kooClass(int с, int d, int f) {х = с; у = d; z = f;}

kooClass operator+(kooClass obj); // Операнд obj передається неявно. kooClass operator=(kooClass obj); // Операнд obj передається неявно, void Show(char*s);

};

// Перевизначення бінарного оператора додавання kooClass kooClass::operator+(kooClass obj)

{

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

tmp.x = х + obj.x; // Операції додавання цілочисельних значень tmp.y = у + obj.y; // зберігають початковий вміст операндів tmp.z = z + obj.z;

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

}

// Перевизначення оператора присвоєння "=". kooClass kooClass: :operator=(kooClass obj)

{

x = obj.x; // Операції присвоєння цілочисельних значень у = obj.y; // зберігають початковий вміст операндів z = obj.z;

// Повернення модифікованого об'єкта операнда, адресованого покажчиком return *this;

// Відображення тривимірних координат х, у, z. void kooClass::Show(char*s)

{

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

cout«"\t\tx=" « x «", y="« у «", z=" « z « endl;

}

Int mainO

{

kooClass ObjA(1, 2, 3), ObjB(K), 10,10), ObjC;

ObjA.ShowfA");

ObjB.Show("B");

ObjC = ObjA + ObjB; // Додавання об'єктів ObjA і ObjB

ObjC.Show("C=A+B");

ObjC = ObjA + ObjB + ObjC; // Множинне додавання об'єктів ObjC.Show("C=A+B+C");

ObjC = ObjB = ObjA; // Множинне присвоєння об'єктів

ObjB.Show("B=A");

ObjC.Show("C=B"); getchO; return 0;

}

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

Координати об'єкта <А>: х= 1, у= 2, z= З

Координати об'єкта <В>: х= 10, у= 10, z= 10

Координати об'єкта <С=А+В>: х= 11, у= 12, z= 13

Координати об'єкта <С=А+В+С>: х= 22, у= 24, z= 26

Координати об'єкта <В=А>: х= 1, у= 2, z= З

Координати об'єкта <С=В>: х= 1, у= 2, z= З

Аналізуючи код цієї програми, можна побачити, що обидві операторні фун­кції мають тільки по одному параметру, хоча вони перевизначають бінарні опера­ції. Цю, на перший погляд, "кричущу" суперечність можна легко пояснити. Йдеть­ся про те, що при перевизначенні бінарного оператора з використанням функції- члена класу їй передається безпосередньо тільки один аргумент. Другий же опосе­редковано передається через покажчик this. Таким чином, у рядку tmp.x = х + obj.x;

під членом-даних х маємо на увазі член this->x, тобто член х зв'язується з об'єктом, який викликає дану операторну функцію. В усіх випадках опосередковано пере­дається об'єкт, який вказується зліва від символу операції, тобто той, який став причиною виклику операторної функції. Об'єкт, який розташовується з правого боку від символу операції, передається цій функції як аргумент. У загальному ви­падку під час застосування функції-члена класу для перевизначення унарного опе­ратора параметри не використовуються взагалі, а для перевизначення бінарного опе­ратора береться до уваги тільки один параметр1. У будь-якому випадку об'єкт, який викликає операторну функцію, опосередковано передається через покажчик this.

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

Щоб зрозуміти механізм перевизначення операторів, розглянемо уважно на­ведену вище програму, починаючи з перевизначеного оператора додавання Під час оброблення двох об'єктів типу kooClass оператором додавання "+" викону­ються операції додавання значень відповідних координат так, як це показано у функції operator+(). Але зауважте, що ця операторна функція не модифікує значень жодного операнда. Як результат виконання операції ця функція повертає об'єкт типу kooClass, який містить результати попарного додавання координат двох об'єк­тів. Щоб зрозуміти, чому операція "+" не змінює вміст жодного з об'єктів-учасни­ків, розглянемо стандартну арифметичну операцію додавання, що застосовується, наприклад, до чисел 10 і 12. Отож, результат виконання операції 10+12 дорівнює 22, але при його отриманні ні число 10, ні 12 не були змінені. Хоча не існує прави­ла, яке б не давало змоги перевизначеному оператору змінювати значення одного з його операндів, все ж таки краще, щоб він не суперечив загальноприйнятим нор­мам і залишався у згоді зі своїм оригінальним призначенням.

Зверніть увагу на те, що операторна функція operator+О повертає об'єкт типу kooClass, хоча вона могла б повертати значення будь-якого іншого допустимого ти­пу, що визначається мовою програмування C++. Однак, той факт, що вона повер­тає об'єкт типу kooClass, дає змогу використовувати оператор додавання "+" у та­ких складних виразах, як ObjA + ObjB + ObjC - множинне додавання. Частина цього виразу (ObjA + ObjB) отримує результат типу kooClass, який потім додається до об'­єкта ObjC. І якби ця частина виразу генерувала значення іншого типу (а не типу ko­oClass), то таке множинне додавання просто не відбулося б.

На відміну від оператора додавання "+", оператор присвоєння "=" модифікує один зі своїх аргументів1. Оскільки операторна функція operator=0 викликається об'єктом, який розташований зліва від символу присвоєння "=", то саме цей об'єкт і модифікується внаслідок виконання операції присвоєння. Після виконання цієї операції значення, яке повертається перевизначеним оператором, містить об'єкт, який було вказано зліва від символу присвоєння2. Наприклад, щоб можна викону­вати настанови, подібні до такої (множинне присвоєння)

ObjA = ObjB = ObjC = ObjD;, необхідно, щоб операторна функція operator=0 повертала об'єкт, який адресується покажчиком this, і щоб цей об'єкт розташовувався зліва від оператора присвоєння "=". Це дасть змогу виконати будь-який ланцюжок присвоєнь.

Операція присвоєння - це одне з найважливіших застосувань покажчика this.

  1. Перевюначення унарних операторів інкремента "++" та декремента

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

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

#include <vcl>

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

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

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

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