67246

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

Лекция

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

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

Украинкский

2014-09-06

118.5 KB

30 чел.

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


 

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

25830. Аудит расчетов с поставщиками и подрядчиками 43 KB
  Цели и задачи аудита расчетов с поставщиками и подрядчиками Основная цель проверки установить правильность ведения расчетов с поставщиками и подрядчиками за полученные товарноматериальные ценности принятые выполненные работы и оказанные услуги. В ходе аудита расчетов с поставщиками и подрядчиками должны быть решены следующие задачи: проверка правильности оформления первичных документов по прибытию товарноматериальных ценностей и получению услуг с целью подтверждения обоснованности возникновения кредиторской задолженности; ...
25831. Аудит расчетов с разными дебиторами и кредиторами 29.5 KB
  Проверка достоверности учета финансовохозяйственных операций ФХО связанных с расчетами с лицами признаваемыми на уровне законодательства о бухучете разными дебиторами и кредиторами а также проверка соответствия ФХО требованиям нормативных правовых актов НПА РФ. ГК РФ; НК РФ; НПА регулирующие правоотношения с разными дебиторами и кредиторами; законодательство о бухучете в т. Основные вопросы проверки: 1 наличие договорных отношений с разными дебиторами и кредиторами соответствие их оформления требованиям НПА РФ; 2 реальность...
25832. Аудит в условиях компьютерной обработки данных 51.5 KB
  Использование технических средств приводит к изменению отдельных элементов организации бухгалтерского учета и внутреннего контроля: для проверки хозяйственных операций наряду с традиционными первичными учетными документами используются и первичные учетные документы на машиночитаемом носителе; постоянные нормативносправочные показатели могут быть проверены по данным хранящимся в памяти компьютера или на машиночитаемых носителях информации; вместо традиционных ручных форм счетоводства может применяться форма учета ориентированная на...
25833. Аудит учета затрат, включаемых в себестоимость продукции (работ, услуг) 40.5 KB
  Себестоимость продукции один из показателей эффективности производства выявляющий во что обходится организации изготовление и сбыт продукции. Себестоимость широко применяется для экономического обоснования решений о производстве новой или прекращении выпуска старой продукции; для определения эффективности мероприятий научнотехнического прогресса рентабельности продукции резервов снижения затрат и др. Все затраты организации на производство определяют производственную себестоимость продукции.
25834. Проверка правильности определения налогооблагаемой базы 50.5 KB
  Проверяется правильность определения имущества не облагаемого налогом Проверяется соответствие ставки используемой банком установленной законодательством Проверка правильности исчисления налога на имущество исходя из ставки и налоговой базы. Не признаются налогоплательщиками организации являющиеся организаторами Олимпийских игр и Паралимпийских игр в соответствии со статьей 3 Федерального закона Об организации и о проведении XXII Олимпийских зимних игр и XI Паралимпийских зимних игр 2014 года в городе Сочи развитии города Сочи как...
25835. Структура и свойства конструкционных сплавов цветных металлов 973.5 KB
  Микроструктура металла (от микро... и лат. structura — строение), строение металла, выявляемое с помощью микроскопа (оптического или электронного). Микроскоп для исследования металла впервые применил П. П. Аносов (1831) при изучении булатной стали. Металлы и сплавы состоят из большого числа кристаллов неправильной формы (зёрен)
25836. Сплавы цветных металлов, обрабатываемые давлением 319.5 KB
  К цветным металлам и сплавам относятся практически все металлы и сплавы, за исключением железа и его сплавов, образующих группу чёрных металлов. Цветные металлы встречаются реже, чем железо и часто их добыча стоит значительно дороже, чем добыча железа. Однако цветные металлы часто обладают такими свойствами, какие у железа не обнаруживаются, и это оправдывает их применение.
25837. Аудит операций на расчетном, валютном и других счетах банка 37.5 KB
  Целью аудиторской проверки операций по расчетному валютному и других счетам в банке является формирование мнения о достоверности бухгалтерской отчетности по разделу Денежные средства и соответствии применяемой методики учета денежных средств на счетах в банке действующим в Российской Федерации нормативным документам. Аудитор при проверке операций по счетам в банке должен учитывать основные нормативные документы регулирующие порядок проведения операций на расчетном валютном и других счетах в банках и бухгалтерский учет этих операций....
25838. Аудит прочих доходов и расходов 58.5 KB
  Целью аудиторской проверки прочих доходов и расходов является формирование мнения о правильности учета прочих доходов и расходов. Задача аудиторской проверки прочих доходов и расходов состоит из следующих вопросов на которые должен ответить аудитор: Бухгалтерский учет прочих доходов и расходов соответствует положениям нормативных актов Данные аналитического и синтетического учета по счету 91 Прочие доходы и расходы соответствуют данным главной книги и баланса Корреспонденция счетов по счету 91 Прочие доходы и расходы составлена в...