Перевантаження операції виклику минтаксично реалізується таким чином:
<тип>operator()(параметри)
Перевантажена операція виклику функції робить об'єкт класу схожим на функцію, яку можна викликати. При цьому допускається присутність списку параметрів, які обчислюються й перевіряються на відповідність компілятором за правилами передавання параметрів:
class FuncClass {
int x;
public:
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 просто друкується вміст масиву: символьний рядок і кількість його входжень у вхідному потоці.