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

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);

Другим аргументом тут виступає число байт в об’єкті, що знищується.