
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
10.3.3 Оператор доступу до члена класу.
Перегружати можна і оператор доступу до члена класу через вказівник
(->). Перегружається він так: operator->(). Функція-член operator->() повинна вертати об’єкт, посилання чи вказівник на об’єкт класу. Розглянемо такий приклад:
classTanyClass {
int x,y;
public:
TanyClass (int xx,int yy){x=xx;y=yy;}
TanyClass * operator->();
int Getx (void) {return x;}
int Gety (void) {return y;}
};
TanyClass * TanyClass : : operator-->()
{cout<<"\n Accessing member:";
return this;}
В даному прикладі перевантажений оператор видає коротке повідомлення перед тим, як вернути вказівник this. Тоді в основній програмі можемо написати:
main()
{TanyClass t(100,200);
cout <<t->Getx()<<'\n';
cout <<t->Gety()<<'\n';
return 0;
}
Приведені в main-функції оператори t->Getx() та t->Gety() насправді виконуються так:
(t.operator->())->Getx()<<“\n”;
(t.operator->())->Gety()<<“\n”;
10.3.4 Перевантаження операторів інкремента та декремента.
В ранніх версіях С++ неможливо відрізнити постфіксні та інфіксні форми при перегрузці операцій. Починаючи з версії 4.5 це можна зробити, наприклад, так:
class TanyClass
{int x;
public:
TanyClass(int xx){
x=xx;}
int operator ++() {
return ++ x ;}
int operator ++(int) {return x++;}
int operator --(){return --x;}
int operator --(int){return x--;}
int Getx(void)
{return x;}};
Нехай визначений екземпляр
TanyClass v;
Тоді будуть еквівалентними наступні конструкції:
v++; та operator ++(0) (v);
++v; та operator ++() (v);
main () {
TanyClass t(100);
cout <<t++; //
cout <<++t; //
}
10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
Як відомо, в програмах ANSI C використовуються функції malloc() та free() разом з їм подібними для виділення та звільнення пам’яті в кучі. В С++ використовуються оператори new та delete. У більшості версій С++ ці оператори насправді скрито реалізуються викликами функцій malloc() та free(). Тому може скластись враження, що немає принципової різниці в управлінні пам’яттю в ANSI C та С++. Проте це не так. Той факт, що new та delete є операторами, дає можливість в С++ їх перегружати. Тобто створювати більш гнучку систему роботи з пам’яттю для об’єктів.
Розглянемо приклад.
Приклад 1.
#pragma warn -aus
//виключаються повідомлення компілятора про те, що
//визначаються і не використовуються змінні
char buf [512]
int index;
class BrandNew {
int x;
public:
BrandNew();
void * operator new(int);
};
void * BrandNew : : operator new()
{cout<<“overload new”<<“\n”;
if (index>512-sizeof(BrandNew)) return 0;
else{
int k=index;
index +=sizeof(BrandNew);
return & buf [k]};}
main ()
{ BrandNew b1;
BrandNew *b2=new BrandNew;
BrandNew *b3=new BrandNew;
BrandNew *b4=new BrandNew;
BrandNew *b5=new BrandNew; }
Аналогiчно перегружається оператор delete. Прототип функції перевантаження оператора delete повинен мати вигляд: void operator delete(void*p); де р посилається на об’єкт, що знищується. В якості альтерантиви можемо оголосити функцію, наприклад, так:
void operator delete(void*p, int size);
Другим аргументом тут виступає число байт в об’єкті, що знищується.