С++ для начинающих

       

Оператор вызова функции


Оператор вызова функции может быть перегружен для объектов типа класса. (Мы уже видели, как он используется, при рассмотрении объектов-функций в разделе 12.3.) Если определен класс, представляющий некоторую операцию, то для ее вызова перегружается соответствующий оператор. Например, для взятия абсолютного значения числа типа int можно определить класс absInt:

class absInt {

public:

   int operator()( int val ) {

      int result = val < 0 ? -val : val;

      return result;

   }

};

Перегруженный оператор operator() должен быть объявлен как функция-член с произвольным числом параметров. Параметры и возвращаемое значение могут иметь любые типы, допустимые для функций (см. разделы 7.2, 7.3 и 7.4). operator() вызывается путем применения списка аргументов к объекту того класса, в котором он определен. Мы рассмотрим, как он используется в одном из обобщенных алгоритмов, описанных в главе 12. В следующем примере обобщенный алгоритм transform() вызывается для применения определенной в absInt операции к каждому элементу вектора ivec, т.е. для замены элемента его абсолютным значением.

#include <vector>

#include <algoritm>

int main() {

   int ia[] = { -0, 1, -1, -2, 3, 5, -5, 8 };



   vector< int > ivec( ia, ia+8 );

   // заменить каждый элемент его абсолютным значением

   transform( ivec.begin(), ivec.end(), ivec.begin(), absInt() );

   // ...

}

Первый и второй аргументы transform() ограничивают диапазон элементов, к которым применяется операция absInt. Третий указывает на начало вектора, где будет сохранен результат применения операции.

Четвертый аргумент – это временный объект класса absInt, создаваемый с помощью конструктора по умолчанию. Конкретизация обобщенного алгоритма transform(), вызываемого из main(), могла бы выглядеть так:

typedef vector< int >::iterator iter_type;

// конкретизация transform()

// операция absInt применяется к элементу вектора int

iter_type transform( iter_type iter, iter_type last,

                     iter_type result, absInt func )

{

   while ( iter != last )

      *result++ = func( *iter++ );  // вызывается absInt::operator()

   return iter;

}

func – это объект класса, который предоставляет операцию absInt, заменяющую число типа int его абсолютным значением. Он используется для вызова перегруженного оператора operator() класса absInt. Этому оператору передается аргумент *iter, указывающий на тот элемент вектора, для которого мы хотим получить абсолютное значение.



Содержание раздела