Здавалка
Главная | Обратная связь

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



Можливість використовувати знаки стандартних операцій для запису виразів як для вбудованих, так і для АТД.

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

Формат операції-функції:

тип_поверн_значення operator знак_операції(специф_параметрів)

{оператори_тіла_функції}

Перевантаження унарних операцій

· Будь-яка унарна операція Å може бути визначена двома способами: або як компонентна функція без параметрів, або як глобальна функція з одним параметром. У першому випадку вираз Å Z означає виклик Z.operatorÅ (), у другому- виклик operatorÅ (Z).

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

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

Синтаксис:

а) у першому випадку (опис в області класу):

тип_поверн_значення operator знак_операції

б) у другому випадку (опис поза областю класу):

тип_поверн_значення operator знак_операції(ідентифікатор_типу)

Приклади.

1)class person 2)class person
{ int age; { int age;
... ...
public: public:
...
void operator++(){ ++age;} friend void operator++(person&);
}; };
void main() void person::operator++(person& ob)
{class person jon; {++ob.age;}
++jon;} void main()
  {class person jon;
  ++jon;}

Перевантаження бінарних операцій

· Будь-яка бінарна операція Å може бути визначена двома способами: або як компонентна функція з одним параметром, або як глобальна (можливо дружня) функція з двома параметрами. У першому випадку xÅy означає виклик x.operatorÅ(y), у другому – виклик operatorÅ(x,y).

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

· Операції, що перевантажуються поза областю класу, повинні мати два операнди, один із яких повинний мати тип класу.

Приклади.

1)class person{...};

class adresbook

{

// містить у якості компонентних даних множину об'єктів типу

//person, що представляються як динамічний масив, чи список дерево

public:

person& operator[](int); //доступ до i-ому об'єкта

};

person& adresbook : : operator[](int i){. . .}

void main()

{class adresbook persons;

class person record;

record = persons[3];

}

2) class person{...};

class adresbook

{ // містить у якості компонентних даних множину об'єктів типу //person, що представляються як динамічний масив, чи список дерево

public:

friend person& operator[](const adresbook&,int); //доступ до i-ого об'єкта

};

person& operator[](const adresbook& ob ,int i){. . .}

void main()

{class adresbook persons;

class person record;

record = persons[3];

}

Перевантаження операції присвоювання

Операція відрізняється трьома особливостями:

· операція не успадковується;

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

· операція може перевантажуватися тільки в області визначення класу. Це гарантує, що першим операндом завжди буде ліводопустимий вираз.

Формат перевантаженої операції присвоювання:

ім'я_класу& operator=(ім'я_класу&);

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

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

Традиційно інтерфейс і реалізацію класу розміщують у різних файлах, як це

було з оголошеннями і визначеннями об'єктів. Інтерфейс записують у заголовні

файли. Ось приклад заголовного файлу для класу точок

 

//Point.h

#ifndef POINT_H

#define POINT_H

class Point

{

// Атрибути

private:

double _x;

double _y;

// Методи

public:

Point (double a=0, double b=0);

Point operator+(Point);

bool operator==(Point);

double modulus ();

double phi ();

}

#endif

 

Ось файл реалізації

 

//Point.cpp

#include ”Point.h”

#include <cmath>

Point :: Point(double a, double b)

{

_x=a; _y=b;

}

Point Point::operator+(Point v)

{

Point w;

w._x = _x + v._x;

w._y = _y + v._y;

return w;

}

bool operator== (Point v)

{

return (_x == v._x) && (_y == v._y);

}

double modulus ()

{

return sgrt(_x*_x+_y*_y);

}

double Point::phi ()

{

return atan(_y/_x);

}

//Кінець Point.cpp

 

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.