67246

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

Лекция

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

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

Украинкский

2014-09-06

118.5 KB

28 чел.

Лекція № 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


 

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

41578. СУБЪЕКТЫ ТРУДОВОГО ПРАВА 73 KB
  Понятие и классификация субъектов трудового права. Субъектами трудового права являются участники общественных отношений определенные трудовым законодательством которые могут владеть трудовыми правами и соответствующими обязанностями. Которые работают на основании трудового договора за пределами страны.
41579. ТРУДОВЫЕ ПРАВООТНОШЕНИЯ 47 KB
  Понятие трудовых правоотношений Условия возникновения трудовых правоотношений Основания возникновения трудовых правоотношений Содержание трудовых правоотношений
41580. КОЛЛЕКТИВНЫЕ ДОГОВОРЫ И СОГЛАШЕНИЯ 52 KB
  Порядок заключения коллективного договора коллективного договора Условия коллективного договора носят обязательный характер. Коллективный договор как институт трудового права – это совокупность правовых норм которые регулируют трудовые и социально-экономические отношения между наемными работниками и работодателями определяют порядок разработки заключения и исполнения трудового договора комплексно регулируют различные вопросы которые касаются разных аспектов трудовых правоотношений.
41581. ПРАВОВОЕ РЕГУЛИРОВАНИЕ ЗАНЯТОСТИ И ТРУДОУСТРОЙСТВА 57.5 KB
  Понятие занятости населения.Государственная служба занятости ее структура и полномочия.Понятие занятости населения.
41582. Трудовой договор. Понятие трудового договора 169.5 KB
  Понятие трудового договора Стороны трудового договора Содержание трудового договора Общий порядок принятия на работу Трудовой договор о работе по совместительству. Совмещение Контракт как особая форма трудового договора. Изменение условий трудового договора. Прекращение трудового договора.
41583. Рабочее время. Понятие рабочего времени 40.5 KB
  К нему относится: Нормальное; Сокращенное; Неполное рабочее время; Дополнительное – законодательно закрепленное отклонение от основного рабочего времени. К нему относится: Сверхурочные работы; Продолжительность рабочего времени в выходные дни праздничные и нерабочие дни; Виды рабочего времени Различают такие виды рабочего времени: нормированное : нормальное сокращенное неполное ненормированное Нормальное рабочее время согласно ст. Коллективными и трудовыми договорами может быть установлена меньшая продолжительность рабочего...
41584. Время отдыха. Понятие времени отдыха 51.5 KB
  Перерывы в течение рабочего дня ст. не зависимо от гражданства; Время отпуска засчитывается в стаж работы. Виды отпусков: ежегодные отпуска: основной дополнительный;
41585. ПРАВОВОЕ РЕГУЛИРОВАНИЕ ОПЛАТЫ ТРУДА 55 KB
  Размер оплаты труда носит императивный характер но все же не может рассматриваться как правовое предписание прямого действия которое дает право работнику требовать корректировки условий оплаты труда.результатов его труда и хозяйственной деятельности предприятия; Поэтому ни в одной норме права не закреплен принцип равной оплаты за труд. Рынок труда и принцип равной оплаты за равный труд – явления взаимоисключающие друг друга т.
41586. Материальная ответственность. Понятие основания и условия возникновения материальной ответственности 40.5 KB
  Материальная ответственность является юридической обязанностью работника и состоит в возмещении ущерба причиненного предприятию своими виновными действиями причинил вред предприятию. Материальная ответственность – это вид ответственности который состоит в обязанности работника возместить в установленном порядке и размере вред причиненный предприятию на котором он работает вследствие не выполнения или ненадлежащего выполнения без уважительных причин своих трудовых обязанностей. В соответствии с нормами трудового права...