67246

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

Лекция

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

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

Украинкский

2014-09-06

118.5 KB

35 чел.

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


 

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

20262. Другий віріальний коефіцієнт для різних моделей потенціалу взаємодії 114 KB
  Методом статистичних сум можна отримати рівняння стану: 1 Співвідношення Камерлінг Онеса: 2 Порівнюючи 1 і 2: другий віріальний коефіцієнт Ідеальний газ: U=0 BT=0 pV=RT Модель твердих сфер: де обєм молекули де не враховуємо притягання В 2 підставляємо ВТ: b V Модель Сюзерленда: = дорівнює першому доданку з 2. При реальний газ веде себе як ідеальний ТБ ТК критична температура тут ми використали 5 та глибина потенціальної ями Оскільки для моделі...
20263. Теорія Перкуса-Йєвіка 94.5 KB
  Теорія ПеркусаЙєвіка. Теорія ПеркусаЙєвіка це спроба встановити ще одне рівняння. Теорія ПеркусаЙєвіка використовує умовні корелятивні функції. Нехай існує функціонал який може бути розкладений у ряд Тейлора по варіації в положенні частинки s1 за визначенням: Розглядались такі функціонали: 1 ; приводить до результатів Перкуса Йевіка; 2 ; приводить до результатів ББГКІ 3 .
20264. Теорія Ван-дер-Ваальса (ВдВ) критичних явищ 99.5 KB
  Теорія ВандерВаальса ВдВ критичних явищ. Одне з рівнянь що описує реальні гази рівняння ВдВ: для 1го моля газу 1 де а і b сталі повязані із силами притягання і відштовхуванням відповідно. Перепишемо 1: При Т1 : ізотерма ВдВ ліва вітка рідкий стан права газоподібний.Перехід із рідкого стану в газоподібний і в зворотному напрямку при звичайних умовах відбувається не вздовж ізотерми ВдВ АВСDE а вздовж ізотерми АЕ яка одночасно є і реальною ізотермою.
20265. Просторові кореляційні функції та властивості кореляційних функцій 63 KB
  Тобто якщо для системи відома функція то ми знаємо яке розташування N частинок системи є найбільш ймовірним. Але через математичні складності обчислень потенціальної енергії взаємодії N частинок системи ця задача розвязана в дуже обмеженому числі випадків. Тому запропонували новий метод: замість функції розподілу густини ймовірностей певних статистичних станів системи Гіббса розглядається набір з N кореляційних функцій різного порядку: унарна кореляційна функція яка характеризує густину ймовірності що одна частинка системи...
20266. Молекулярна структура рідин. Два способи опису молекулярної структури 64 KB
  dV1 dV2 r EMBED Equation.3 EMBED Equation.3 Г Р КР EMBED Equation.3 EMBED Equation.
20267. Поглинання звуку у в’язкопружних середовищах 80 KB
  Реологічне рівняння це рівняння яке повязує тензор напруг з тензором деформацій і тензором швидкості деформацій. Для вязкопружнього середовища реологічне рівняння: тензор напруг; тензор деформації; тензор швидкості деформації. та тоді наше рівняння буде мати вигляд: Звукова хвиля це плоска хвиля. У вязкопружньому середовищі на відміну від пружнього Підставляючи наше реологічне рівняння в рівняння руху отримаємо хвильове рівняння для звукової хвилі : Розв´язуючи це рівняння за умови Отримуємо вирази для швидкості...
20268. Оборудование подсистемы базовой станции (BSS) 523.5 KB
  1: контроллера базовой станции BSC Base Station Controller; базовой станции BTS Base Transceiver Station. Контроллер базовой станции BSC Контроллер базовой станции BSC центральная часть подсистемы базовой станции BSS. Контроллер BSC фирмы Ericsson рис. Контроллер BSC может контролировать радиосеть и рационально выравнивать временные дисбалансы в нагрузке на сеть.
20269. Оборудование подсистемы базовой станции (BSS). Блок приемопередатчика (TRU) 631.5 KB
  Он взаимодействует с другими компонентами через локальную шину Local Bus шину CDU шину синхронизации Timing Bus и Хшину Xbus. Блок объединения и распределения CDU CDU является интерфейсом между блоками TRU и антенной системой. CDU объединяет сигналы от нескольких приемопередатчиков и распределяет принятые сигналы ко всем приемникам. В функции CDU входит: объединение передаваемых сигналов; предусиление и распределение принимаемых сигналов; поддержка контроля антенной системы; фильтрация на радиочастоте; электропитание и контроль...
20270. ПОДСИСТЕМЫ И КОНФИГУРАЦИИ АППАРАТНЫХ СРЕДСТВ АХЕ10 893.5 KB
  Состоит из аппаратных средств модули временных TSM и пространственных SPM коммутаторов и центрального и регионального программного обеспечения; импульсный тактовый генератор Clock Pulse Generating and Timing CLT. Функциональные блоки GSS CLM Clock Module модуль тактового генератора; CLT Clock Pulse Generating and Timing импульсный тактовый генератор; GS Group Switch коммутационное поле; GSM Group Switch Maintenance техническое обслуживание коммутационного поля; NS Network Synchronization сетевая синхронизация; NSC...