значена в класі як дружня, або у неї повинен бути хоча б один параметр типу клас (або посилання на клас).
Якщо для класу T введена операція-функція з наведеним вище заголовком і визначені два об'єкти A і B класу T, то вираз A * B інтерпретується як виклик функції operator * (A, B).
Розглянемо приклад. Реалізуємо перевантаження операції додавання для класу комплексних чисел. br/>
class comp
{float im; float real;
public:
comp (float i, float r)
{real = r;
im = i;}
comp operator + (Comp X)
{return comp (im + X.im, real + X.real);}
}
void main ()
{ ...
comp C1 (1.1), C2 (5,5), C3;
C3 = C1.operator + (C2)// Прямий виклик операції-функції. Не використовується. p> C3 = C1 + C2// Непрямий виклик операції-функції.
...
}
Компілятор за типами об'єктів С1 і С2 визначає, що необхідно реалізувати не просто додавання двох скалярів, як це буває в звичайному використанні операції +, а викликати перевантажену функцію operator +. Так як при визначенні класу поля im і real доступні функціям класу, є необхідність визначати тільки другий об'єкт (X в нашому прикладі).
У мові C + + потрібно, щоб операції присвоювання, індексації та непрямого звернення до полів класу (->) обов'язково визначалися як методи, тобто як функції-члени класу.
Коли лівий операнд операції є представником класу, перевантажену операцію потрібно визначати як метод цього класу.
Для багатьох операцій C + + існують свої особливості при перевантаженні (доопределение). Так, унарні операції перевизначаються з описом операції-функції без аргументу, наприклад:
class A
{ ...
A operator - () {Текст функції}
... }
Відповідно доопределение бінарної операції використовує опис операції-функції з одним аргументом, тому що другим є об'єкт, для якого викликана операція. Слід також пам'ятати, що операція присвоювання "=" може перевантажуватися тільки оголошенням методу без описателя static. Те ж відноситься до операцій "()" і "[]". p> Подивимося, як буде виглядати перевантаження операції привласнення для прикладу з комплексними числами.
comp & operator = ([const] comp & X)
{real = X.real;
im = X.im;
return * this;}
Якщо вказуємо const, то це показує, що в поточному стані повинен змінюватися всередині функції, а крім того, дозволяє обробляти константні об'єкти.
Операція присвоювання НЕ успадковується.
Константні єкти і константні методи
const Loc NK (0,0);// константний об'єкт
Після ініціалізації спроби зміни константного об'єкта відстежуються і присікаються компілятором.
Оголошення константної функції в тілі класу виглядає наступним чином:
Прототип const;
ПРАВИЛО:
Константні методи
1) не повинні міняти значення елементів класу;
2) не повинні викликати інші неконстантние методи класу.
Константні методи можуть застосовуватися як для константних, так і для неконстантних об'єктів.
Література
1. М.Уейт, С.Прата, Д.Мартін Мова Сі: Пер з англ.-М.: Світ, 1988.-463 с., Іл. p> 2. Уїнер Р. Мова Турбо Сі: Пер з англ.-М.: Світ, 1991.-384 с., іл.
3. Беррі Р., Мікінз Б. Мова Сі: введення для програмістів: Пер. з англ.-М.: Фінанси і статистика, 1988.-с., мул.
4. TURBO C + +. Borland International. Inc. 1990. br/>