Оператор вызова функций должен быть перегружен только как нестатический член класса!
Формат:
тип operator () (список_параметров), где список параметров может быть неопределенным и значения могут быть определены по умолчанию.
Оператор вызова функций применяется в том случае, когда нужно использовать объект как функцию, в этом случае такие объекты называются объектами-функциями или функторами (functors). Рассмотрим пример на классе Point (точка):
class Point{
private:
int x;
int y;
public:
Point(int x, int y){
this->x=x;
this->y=y;
}
Point() {}
Point operator()(int i,int j){
x=i;
y=j;
return *this;
}
Point operator+(Point obj){
Point temp;
temp.x = obj.x + x;
temp.y = obj.y + y;
return temp;
}
void show(){
cout< < "x: "< < x< < " y: "< < y< < endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Point obj1(10, 20), obj2(1, 1); //вызываются конструкторы формата Point(x,y)
obj1.show();
obj1(7, 8); // вызывается оператор() который меняет наши значения.
obj1.show();
obj1 = obj2 + obj1(10, 10); // может быть использовано в выражениях
obj1.show();
getchar();
return 0;
}
Результаты:
10,20
7,8
11,11
В другом случае нам пришлось бы писать функцию, где нужно было бы указывать значения. Один минус этого примера в том, что можно спутать оператор () с конструктором...
Зато благодаря этой перегрузки можно написать такой код:
list lst;
//инициализируем весь список
for_each(lst.begin(),lst.end(), Point(1,1));
///теперь все значения точек в списке поменяются на 1,1
///отличный способ использования stl
Также перегрузка этого оператора применяется в задаче индексирования многомерного массива и в задаче выделения подстроки.
Объект функция имеет такими преимуществами перед обычными функциями:
- Каждому объекту функции соответствует свой тип.
- Объект функции можно инициализировать на стадии выполнения перед ее вызовом.