Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

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

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

Приклад:

class Pereg

{

int h;

public:

Pereg (int h)

{this->h = h;}

Int geth()

{ return h; }

Void set_h (int h)

{

this->h = h;

};

// перевантаження (префіксного) інкремента

Pereg& operator ++()

{++h; return *this;}

// перевантаження (префіксного) декремента - дружня функція

friend Pereg& operator --(Pereg& per);

// перевантаження постфіксного інкрімента

Pereg& operator ++(int)

{h++; return *this;}

// перевантаження постфіксного декремента

Pereg& operator --(int)

{h--; return *this;}

};

// дружня функція

Pereg& operator --(Pereg& per)

{--per.h; return per;}

// звичайна функція (глобальна функція)

bool operator !(Pereg& per)

{

if(per.geth()) return false;

return true;

}

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

5.3 Перевантаження бінарних операторів та операторів присвоювання

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

Оператор присвоювання визначений в будь-якому класі за умовчанням як поелементне копіювання. Цей оператор викликається кожного разу, коли одному існуючому об'єкту присвоюється значення іншого. Якщо клас містить поля, пам'ять під яких виділяється динамічно, необхідно визначити власний оператор привласнення. Щоб зберегти семантику присвоювання, функція-оператор повинна повертати посилання на об'єкт, для якого вона викликана, і приймати як параметр єдиний аргумент – посилання на присвоєний об'єкт.

Приклад:

class Pereg2: public Pereg

{

int h;

public:

char* name;

Pereg2(int h):Pereg(h)

{

this->h = h;

}

Pereg2(int h, char* nam):Pereg(h)

{

this->h = h;

if(nam == 0)name = 0;

else

{

name = new char [strlen(nam)+1];

strcpy(name,nam);

}

}

int geth() {return h;}

bool operator >(Pereg2& cl)

{

if( h > cl.geth()) return true;

return false;

}

Pereg2& operator = ( Pereg2 &M)

{

if(&M == this) return *this;

if(name) delete [] name;

if(M.name)

{

name = new char [strlen(M.name)+1];

strcpy(name,M.name);

}

else name = 0;

this->h = M.h;

return *this;

}

};

class Pereg3

{

int a;

public:

char name[10];

int get_a(){return a;}

void set_a(int a) {this->a = a;}

Pereg3(int a, char* nam)

{

strcpy(name,nam);

this->a = a;

}

Pereg3(){;}

Pereg3& operator +(Pereg3& cl)

{

a = a + cl.a;

return *this;

}

};