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

Int operator()(void);

FuncClass(int n){x=n;}};

Int FuncClass::operator()(void)

{return x;}

main()

{FuncClass object=100;

int q=object();

cout<<q;

return 0;}

Перевантаження операції виклику функції може бути корисним у випадку, коли об’єкт має домінуючу властивість. Розглянемо приклад. Перевантажимо оператор індексування масиву, щоб індексом перевантаженої операції був символьний рядок (див. другу програму в підрозд. 7.12.3). Використаємо перевантажену операцію kbit для ініціалізації полів масиву структур vec (див. програмну реалізацію нижче). Водночас у класі associ опишемо дружній клас iterator, у якому перевантажимо операцію виклику функції, щоб вона забезпечувала послідовний доступ до елементів масиву vec типу vidnosh.

# include <string.h>

# include <iostream.h>

struct vidnosh {

char*name;

int val;

};

class associ {

friend class iterator;

public:

Vidnosh*vec;

int max;

int free;

associ(int);

int& operator[ ](char*);

};

associ::associ(int_max)

{max=_max;

vec=new vidnosh[max];

free=0;

}

int& associ::operator[](char*_s)

{

vec[free].name=new char[256];

strcpy(vec[free].name,_s);

vec[free].val=free;

return free;

}

class iterator {

associ*cs;

int i;

public:

iterator(associ& s){cs=&s;i=0;}

vidnosh*operator()(void)

{

return(i<cs->free)?&cs->vec[i++]:NULL;

}

};

main()

{

vidnosh*p=new vidnosh;

const Max=256;

char buf[Max];

associ mas(512);

while(cin>>buf)mas[buf]++;

iterator next(mas);

while(p=next())cout<<p->name<<" "<<\

p->val<<"\n";

}

У наведеному прикладі клас iterator містить перевантажений оператор виклику функції, що повертає наступний елемент динамічного масиву vec, елементами якого є структури типу vidnosh. Цей масив (у прикладі – 512 елементів) утворюється при визначенні екземпляра mas класу assoc та ініціалізується в циклі while (cin<<buf) mas[buf]++;. Тіло циклу виконується доти, доки не зустрінеться символ кінця файла. В останньому операторі while просто друкується вміст масиву: символьний рядок і кількість його входжень у вхідному потоці.

7.12.5. Перевантаження операції доступу до члена класу

Операцію доступу до члена класу можна перевантажити через покажчик (->). Перевантажується він так: operator->(). Функція-член operator->() має повертати покажчик на об'єкт класу. Наприклад:

class MyClass {

public:

int x,y;

MyClass(int_x,int_y){x=_x;y=_y;}

MyClass*operator->();

};

MyClass*MyClass::operator->()

{

x*=2;

y*=2;

cout<<"\nПеревантажений оператор:";

return this;}

У цьому прикладі перевантажена операція подвоює значення полів і видає коротке повідомлення перед тим, як повернути покажчик this. В основній програмі можемо записати:

main()

{MyClass a(12,25);

cout<<a->x<<'\n';

cout<<a->y<<'\n';

return 0;}

Зазначимо, що в main()-функції перевантажена операція -> уже застосовується не до покажчика на клас, а до екземпляра класу. Якщо описати покажчик на клас і застосувати операцію ->, то викличеться стандартна операція доступу до поля, а не перевантажена. Перевантажені операції працюють лише з екземплярами класів, у яких вони перевантажуються.

Наведені в main-функції операції a->x та a->y виконуються так:

(a.operator->())->x<<"\n";

(a.operator->())->y<<"\n";