67246

Перевантаження бінарних операторів «+» і «=»

Лекция

Информатика, кибернетика и программирование

Перевантаження операторів — одна з найефективніших можливостей мови C++. Вона дозволяє повністю інтегрувати нові класи в існуюче програмне середовище. Після перевантаження операції над об'єктами нових класів виглядають точно так, як і операції над змінними вбудованих типів.

Украинкский

2014-09-06

118.5 KB

39 чел.

Лекція № 10

Тема: Перевантаження бінарних операторів "+" і "="

План

  1.  Перевантаження операторів.
  2.  Створення операторної функції-члена
  3.  Перевантаження оператора додавання "+".
  4.  Перевантаження оператора присвоєння "=".

  1.  Перевантаження операторів.

    Перевантаження операторів — одна з найефективніших можливостей мови C++. Вона дозволяє повністю інтегрувати нові класи в існуюче програмне середовище. Після перевантаження операції над об'єктами нових класів виглядають точно так, як і операції над змінними вбудованих типів. Крім того, перевантаження операторів лежить в основі системи введення-висновку в мові C++.

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

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

  1.  Створення операторної функції-члена

   Операторна функція-член має наступний вигляд:

тип_повертаємого_значення імя_класу::operator# (список-аргументів)

{

...   //  Операції

}

    Зазвичай операторна функція повертає об'єкт класу, з яким вона працює, проте тип значення, що повертається, може бути будь-яким. Символ # замінюється перенавантажуваним оператором. Наприклад, якщо в класі перевантажується оператор ділення "+", операторна функція-член називається operator+.

    Почнемо  з  простого  прикладу.  У  наведеному  нижче  коді  програми  створюється клас kooClass, який підтримує дії з координатами об'єкта в тривимірному просторі. Для  класу  kooClass  перевантажуються  оператори  додавання "+"  і  присвоєння "=". Отже, розглянемо уважно код цієї програми.

Приклад 1. Демонстрація механізму перевантаження бінарних операторів додавання "+"  

                   та присвоєння "=" за допомогою функцій-членів класу

class kooClass

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

public:

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

kooClass(int c, int d, int f) {x = c; y = 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 = x + obj.x;               // Операції додавання цілочисельних значень

tmp.y = y + obj.y;               // зберігають початковий вміст операндів

tmp.z = z + obj.z;

 

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

}

 

        // Перевантаження оператора присвоєння "=".

kooClass kooClass::operator=(kooClass obj)

{           x = obj.x;                 // Операції присвоєння цілочисельних значень

y = obj.y;                 // зберігають початковий вміст операндів

z = obj.z;

 

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

}

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

void kooClass::Show(char *s)

{           cout << "Koordunatu obj <" << s << ">: ";

cout << "   x= " << x << ", y= " << y << ", z= " << z << endl;

}

 

void main()

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

ObjA.Show("A");

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");

}

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

Координати об'єкта <A>:          x= 1, y= 2, z= 3

Координати об'єкта <B>:           x= 10, y= 10, z= 10

Координати об'єкта <C=A+B>:       x= 11, y= 12, z= 13

Координати об'єкта <C=A+B+C>:     x= 22, y= 24, z= 26

Координати об'єкта <B=A>:       x= 1, y= 2, z= 3

Координати об'єкта <C=B>:       x= 1, y= 2, z= 3

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

tmp.x = x + obj.x;

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

  1.  Перевантаження оператора додавання "+".

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

  1.  Перевантаження оператора присвоєння "=".

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

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

ObjA = ObjB = ObjC = ObjD;,

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

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

    

Бінарні операції – ті, у виконанні яких беруть участь два об’єкти. Унарні – ті, які виконуються в середині об’єкта.

опера́нд— аргумент операції

Тема: Механізми перевантаження операторів з використанням функцій-не членів класу

План

  1.  Використання функцій-"друзів" класу для перевантаження унарних операторів
  2.  Використання функцій-"друзів" класу для перевантаження бінарних операторів

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

    З використанням функцій-не членів класу не можна перевантажувати такі оператори:

=,   (),  [], –>.

  1.  Використання функцій-"друзів" класу для перевантаження бінарних операторів

    У наведеному нижче коді програми для перевантаження бінарного оператора додавання "+" використовується "дружня" функція класу.

Приклад 1. Демонстрація механізму перевизначення бінарного оператора додавання "+" за

                   допомогою "дружньої" функції класу

class kooClass

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

public:

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

kooClass(int c, int d, int f) { x = c; y = d; z = f; }

 friend kooClass operator+(kooClass obi, kooClass obj);

kooClass operator=(kooClass obj);      // Операнд obj передається неявно.

 void Show(char *s);

};

 

     // Операторна "дружня" функція класу.

     // Перевизначення бінарного оператора додавання "+".

kooClass operator+(kooClass obi, kooClass obj)

{

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

tmp.x = obi.x + obj.x;

tmp.y = obi.y + obj.y;

tmp.z = obi.z + obj.z;

 

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

}

 

     // Перевизначення оператора присвоєння "=".

kooClass kooClass::operator=(kooClass obj)

{

x = obj.x;

y = obj.y;

z = obj.z;

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

}

 

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

void kooClass::Show(char *s)

{

cout << "Koordunatu obj  <" << s << ">: ";

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

}

 

void main()

{

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

 

ObjA.Show("A");

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 ;            // Множинне присвоєння об'єктів

ObjC.Show("C=B");

ObjB.Show("B=A");

 

}

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

Координати об'єкта <A>:    x= 1, y= 2, z= 3

Координати об'єкта <B>:    x= 10, y= 10, z= 10

Координати об'єкта <C=A+B>:    x= 11, y= 12, z= 13

Координати об'єкта <C=A+B+C>:  x= 22, y= 24, z= 26

Координати об'єкта <C=B>:    x= 1, y= 2, z= 3

Координати об'єкта <B=A>:    x= 1, y= 2, z= 3

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

такий випадок.

    Як уже зазначалося вище, показник на об'єкт, який викликає операторну  функцію-члена  класу,  передається  за  допомогою  ключового  слова  this. Під час використання бінарного оператора функцію викликає об'єкт, який розташований  зліва  від нього.  І це  чудово  за  умови, що  лівий  об'єкт  визначає  задану операцію. Наприклад, якщо у нас є певний об'єкт tmp.obj, для якого визначено операцію додавання з цілим числом, тоді такий запис є цілком допустимим виразом:

tmp.obj + 10;         // працюватиме

Оскільки  об'єкт  tmp.obj  знаходиться  зліва  від  операції  додавання "+",  то  він викликає операторну функцію, яка (імовірно) здатна виконати операцію додавання  цілочисельного  значення  з  деяким  елементом  об'єкта  tmp.obj.  Але  наведений нижче вираз працювати не буде:

10 + tmp.obj;        // не працюватиме

Йдеться про те, що у цьому записі константа, яка розташована зліва від оператора додавання "+",  є цілим числом, тобто є  значенням вбудованого типу, для якого не визначено жодної операції, операндами якої є ціле число  і об'єкт класового типу.

     Вирішення такого питання базується на перевантаженні оператора додавання "+"  з використанням двох функцій-"друзів" класу. У цьому випадку операторній функції  безпосередньо  передаються  обидва  операнди,  після  чого  вона  виконується подібно до будь-якої іншої перевантаженої функції, тобто на основі типів її аргументів. Одна версія операторної функції operator+() оброблятиме аргументи об'єкт +  int-значення, а  інша – аргументи  int-значення + об'єкт. Перевантаження бінарного оператора додавання "+" (або будь-якого іншого бінарного оператора: "–", "*", "/") з використанням функцій-"друзів" класу дає змогу розташовувати значення  вбудованого  типу  як  справа,  так  і  зліва  від операції. Механізм перевантаження такої операторної функції показано у наведеному нижче коді програми.

Приклад 2. Демонстрація механізму перевантаження бінарних операторів множення "*" і

                   ділення "/" з використанням функцій-"друзів" классу

class kooClass

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

public:

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

kooClass(int c, int d, int f) { x = c; y = d; z = f; }

 friend kooClass operator*(kooClass obi, int c);

 friend kooClass operator*(int c, kooClass obi);

 friend kooClass operator/(kooClass obi, int c);

 friend kooClass operator/(int c, kooClass obi);

 void Show(char *s);

};

 

    // Операторна "дружня" функція класу.

    // Перевантаження бінарного оператора множення "*".

kooClass operator*(kooClass obi, int c)

{

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

tmp.x = obi.x * c;

tmp.y = obi.y * c;

tmp.z = obi.z * c;

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

}

 

    // Операторна "дружня" функція класу.

    // Перевантаження бінарного оператора множення "*".

kooClass operator*(int c, kooClass obi)

{

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

tmp.x = c * obi.x;

tmp.y = c * obi.y;

tmp.z = c * obi.z;

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

}

 

    // Перевантаження бінарного оператора ділення "/".

kooClass operator/(kooClass obi, int c)

{

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

tmp.x = obi.x / c;

tmp.y = obi.y / c;

tmp.z = obi.z / c;

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

}

    // Перевантаження бінарного оператора ділення "/".

kooClass operator/(int c, kooClass obi)

{

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

tmp.x = c / obi.x;

tmp.y = c / obi.y;

tmp.z = c / obi.z;

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

}

 

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

void kooClass::Show(char *s)

{

cout << "Koordunatu obj   <" << s << ">: ";

cout << "   x= " << x << ", y= " << y << ", z= " << z << endl;

}

 

void main()

{

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

 int a = 10, b = 5;

 

ObjA.Show("A");

ObjB.Show("B");

ObjC = ObjA * a;       // Множення об'єкта ObjA на число a

ObjC.Show("C=A*a");

ObjC = a * ObjA;       // Множення числа a на об'єкт ObjA

ObjC.Show("C=a*A");

ObjC = ObjB / b;       // Ділення об'єкта ObjB на число b

ObjC.Show("C=B*b");

ObjC = a / ObjB;        // Ділення числа a на об'єкт ObjB

ObjC.Show("C=a/B");

}

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

Координати об'єкта <A>:    x= 1, y= 2, z= 3

Координати об'єкта <B>:    x= 10, y= 10, z= 10

Координати об'єкта <C=A*a>:    x= 10, y= 20, z= 30

Координати об'єкта <C=a*A>:    x= 10, y= 20, z= 30

Координати об'єкта <C=B/b>:    x= 2, y= 2, z= 2

Координати об'єкта <С=a/B>:    x= 1, y= 1, z= 1

   З наведеного вище бачимо, що операторна функція operator*() перевантажується двічі, забезпечуючи при цьому два можливі випадки участі цілого числа  і об'єкта типу kooClass в операції додавання. Аналогічно перевантажується двічі операторна функція operator/().

  1.  Використання функцій-"друзів" класу для перевантаження унарних операторів

   За допомогою функцій-"друзів" класу можна перевантажувати й унарні оператори. Але  усвідомлення механізму  реалізації  такого  перевантаження  вимагатиме від програміста деяких додаткових  зусиль. Спершу подумки повернемося до початкової форми перевантаження унарного оператора інкремента "++", визначеного для  класу  kooClass  і  реалізованого  у  вигляді  функції-члена  класу.  Для  зручності проведення аналізу наведемо код цієї операторної функції:

                  // Перевантаження префіксної форми унарного оператора інкремента "++"

kooClass kooClass::operator++()

{  x++;

    y++;

    z++;

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

}

    Як уже зазначалося вище, кожна функція-член класу отримує (як опосередковано  переданий)  аргумент  this,  який  є  показником  на  об'єкт,  який  викликав  цю функцію.  При  перевантаженні  унарного  оператора  за  допомогою  функції-члена класу аргумент безпосередньо не передаються. Єдиним аргументом, необхідним у цій ситуації, є неявний показник на викликуваний об'єкт. Будь-які зміни, що вносяться  в  члени-даних  об'єкта,  вплинуть  на  об'єкт,  для  якого  було  викликано  цю операторну функцію. Отже, у процесі виконання настанови x++ (у попередній функції) буде інкрементовано член-даних x викликуваного об'єкта.

     На відміну від функцій-членів класу, функції-не члени (у тому числі  і "друзі") класу не отримують показника this і, як наслідок, не мають доступу до об'єкта,  для  якого  вони  були  викликані. Але,  як  уже  зазначалося  вище,  операторній "дружній"  функції  операнд  передається  безпосередньо.  Тому  спроба  створити операторну "дружню" функцію operator++() у такому вигляді успіху не матиме:

     // Цей варіант перевантаження операторної функції працювати не буде

kooClass operator++(kooClass obi)

{  obi.x++;

   obi.y++;

   obi.z++;

   return obi;

}

    Ця операторна функція не працездатна, оскільки тільки копія об'єкта, яка активізує виклик функції operator++(), передається функції через параметр obi. Таким чином, зміни в тілі функції operator++() не вплинуть на викликуваний об'єкт, позаяк вони змінюють тільки локальний параметр.

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

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

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

Приклад 3. Демонстрація механізму використання "дружньої" функції класу для

                   перевантаження префіксної та постфіксної форми операторів інкремента

class kooClass

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

public:

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

kooClass(int c, int d, int f) { x = c; y = d; z = f; }

 friend kooClass operator*(kooClass obi, kooClass obj);

kooClass operator=(kooClass obj);

    /* Ці функції для перевизначення оператора інкремента "++"  

            використовують посилальні параметри.*/

 friend kooClass operator++(kooClass &obi);

 friend kooClass operator++(kooClass &obi, int notused);

 void Show(char *s);

};

 

   // Операторна "дружня" функція класу.

kooClass operator*(kooClass obi, kooClass obj)

{

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

tmp.x = obi.x * obj.x;

tmp.y = obi.y * obj.y;

tmp.z = obi.z * obj.z;

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

}

   // Перевантаження оператора присвоєння "=".

kooClass kooClass::operator=(kooClass obj)

{

x = obj.x;

y = obj.y;

z = obj.z;

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

                         показником

}

 

    /* Перевизначення префіксної форми унарного оператора інкремента "++"  з          

       використанням "дружньої" функції класу. Для цього необхідне використання     

       посилального параметра. */ 

kooClass operator++(kooClass &obi)

{

obi.x++;

obi.y++;

obi.z++;

 return obi;

}

 

   /* Перевизначення постфіксної форми унарного оператора інкремента "++" з  

      використанням "дружньої" функції класу. Для цього необхідне використання  

      посилального параметра. */ 

kooClass operator++(kooClass &obi, int notused)

{

kooClass tmp = obi;

obi.x++;

obi.y++;

obi.z++;

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

}

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

void kooClass::Show(char *s)

{

cout << "Koordunatu obj  <" << s << ">: ";

cout << "    x= " << x << ", y= " << y << ", z= " << z << endl;

}

void main()

{

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

ObjA.Show("A");

ObjB.Show("B");

ObjC = ObjA * ObjB;         // Множення об'єктів ObjA і ObjB

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

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

ObjC.Show("c");

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

ObjC.Show("C=B");

ObjB.Show("B=A");

++ObjC;               // Префіксна форма операції інкремента

ObjC.Show("++C");

ObjC++;               // Постфіксна версія інкремента

ObjC.Show("C++");

ObjA = ++ObjC;         // Об'єкт ObjA набуває значення об'єкта ObjC після інкрементування.

ObjA.Show("A = ++C");   // У цьому випадку об'єкти ObjA і ObjC

ObjC.Show("C");         // мають однакові значення координат.

ObjA = ObjC++;          // Об'єкт ObjA набуває значення об'єкта ObjC до інкрементування.

ObjA.Show("A=C++");     // У цьому випадку об'єкти ObjA і ObjC

ObjC.Show("C");         // мають різні значення координат.

}

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

Координати об'єкта <A>:    x= 1, y= 2, z= 3

Координати об'єкта <B>:    x= 10, y= 10, z= 10

Координати об'єкта <C=A*B>:    x= 10, y= 20, z= 30

Координати об'єкта <C=A*B*C>:  x= 100, y= 400, z= 900

Координати об'єкта <C=B>:    x= 1, y= 2, z= 3

Координати об'єкта <B=A>:    x= 1, y= 2, z= 3

Координати об'єкта <++С>:    x= 2, y= 3, z= 4

Координати об'єкта <С++>:    x= 3, y= 4, z= 5

Координати об'єкта <A=++С>:    x= 4, y= 5, z= 6

Координати об'єкта <С>:    x= 4, y= 5, z= 6

Координати об'єкта <A=C++>:    x= 4, y= 5, z= 6

Координати об'єкта <С>:    x= 5, y= 6, z= 7


 

А также другие работы, которые могут Вас заинтересовать

17303. Засоби адаптивного управління інформаційною безпекою. Система виявлення уразливостей захисту 119.5 KB
  Лекція 13. Засоби адаптивного управління інформаційною безпекою. Система виявлення уразливостей захисту Основні рішення В умовах обмежених ресурсів використання засобів SAFEsuite є проблематичним ізза їх високої ціни. Основною задачею є пошук безкоштовних засобів адап...
17304. Технологія захисту інформації на базі захищених віртуальних приватних мереж 336 KB
  Лекція 15. Технологія захисту інформації на базі захищених віртуальних приватних мереж Концепція побудови захищених віртуальних приватних мереж VPN У основі концепції побудови захищених віртуальних приватних мереж VPN лежить достатньо проста ідея: якщо в глобальній ...
17305. Класифікація і рішення для побудови віртуальних приватних мереж VPN 216 KB
  Лекція 16. Класифікація і рішення для побудови віртуальних приватних мереж VPN Класифікація VPN Різні автори порізному проводять класифікацію VPN. Найчастіше використовуються три наступні ознаки класифікації: робочий рівень моделі OSI; конфігурація структурного ...
17306. Основи захисту периметру корпоративних мереж Засоби захисту периметру 530 KB
  Лекція 23. Основи захисту периметру корпоративних мереж Засоби захисту периметру Периметр це укріплена границя корпоративної мережі що може включати: маршрутизатори routers; брандмауери firewalls; проксісервери; proxyservers систему виявлення вторгнень IDS; ...
17307. Захист Windows Server. Механізми зміцнення безпеки Windows Server 123 KB
  Лекція 18. Захист Windows Server Механізми зміцнення безпеки Windows Server Операційна система Windows Server містить майстер настройки безпеки засіб заснований на використанні ролей що дозволяє забезпечити додаткову безпеку серверів. При використанні спільно з об'єктами групової п...
17308. Захист SQL Server 143 KB
  Лекція 19. Захист SQL Server Загальні положення Система управління базами даних Microsoft SQL Server має різноманітні засоби забезпечення захисту даних. Якщо база даних призначена для використання більш ніж однією людиною необхідно поклопотатися про розмежування прав доступу. В ...
17309. Захист web-серверів 139 KB
  Лекція 20. Захист webсерверів Правила забезпечення захисту Публічні вебсервери продовжують залишатися об'єктами атак хакерів які хочуть за допомогою цих атак нанести dтрату репутації організації або добитися якихнебудь політичних цілей. Хороші заходи захисту можуть...
17310. Захист поштових серверів Exchange Server 201 KB
  Лекція 21. Захист поштових серверів Exchange Server Основні рекомендації для забезпечення безпеки Хоча існує величезна кількість різних складних і сучасних засобів які можна використовувати для посилення безпеки структури сервера Exchange не варто недооцінювати наступні осн
17311. ЗАХИСТ ЛОКАЛЬНИХ МЕРЕЖ ВІД ВИТОКІВ КОНФІДЕНЦІЙНОЇ ІНФОРМАЦІЇ 161 KB
  Лекція 22. Захист локальних мереж від витоків конфіденційної інформації Основні характеристики систем запобігання витокам інформації З розвитком ІТ секрети стали уразливі як ніколи. У епоху паперових документів співробітникові було скрутно непомітно винести докум