пятница, 25 января 2013 г.

Перегрузка оператора вызова функций operator () в С++


Оператор вызова функций должен быть перегружен только как нестатический член класса!
Формат: 
тип 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

Также перегрузка этого оператора применяется в задаче индексирования многомерного массива и в задаче выделения подстроки.

Объект функция имеет такими преимуществами перед обычными функциями:

  • Каждому объекту функции соответствует свой тип.
  • Объект функции можно инициализировать на стадии выполнения перед ее вызовом.


1 коммент.:

Я не могу поблагодарить Мистера Бенджамина за обслуживание и сообщить людям, как я благодарен за всю помощь, которую вы и ваши сотрудники оказали, и я с нетерпением жду рекомендации друзьям и членам семьи, если им понадобится финансовая консультация или помощь @ 1,9% Бизнес-кредит. Контакты:. lfdsloans@outlook.com. WhatsApp ... + 19893943740. Продолжайте в том же духе.
Спасибо, Бусарахам.

Отправить комментарий