Функциональные объекты. STL (часть 11)




функтор, с++ для начинающих, функциональный объект, библиотека стл, stlВ предыдущих обсуждениях уже неоднократно мелькал такой термин как функтор, но особую актуальность он приобретает применительно к алгоритмам. Теперь пришло время разобраться с этим понятием. Функтор — это сокращение от функциональный объект, представляющий собой конструкцию, позволяющую использовать объект класса как функцию. В C++ для определения функтора достаточно описать класс, в котором переопределена операция ().

То, как из объекта образуется функция, легко показать на таком простом примере:

Уже из такого простого примера видно следующее: операция () в классе может быть переопределена (точнее определена, поскольку она не имеет реализации по умолчанию) с произвольным числом, типом параметров и типом возвращаемого значения (или даже вовсе без возвращаемого значения). В итоге:

функтор, с++ для начинающих, функциональный объект, библиотека стл, stl

Выгода функтора состоит в том, что а). его можно параметризовать при создании объекта (перед вызовом) используя конструктор объекта с параметрами и б). может создаваться временный объект исключительно на время выполнения функционального вызова. Это иллюстрируется примером такого упрощённого целочисленного калькулятора:

Здесь в строке cout << calculate( oper )( op1, op2 ) действия выполняются последовательно:

  • создаётся временный объект класса calculate конструктором с параметром oper;

  • для этого объекта выполняется метод () (функциональный вызов) с двумя параметрами;

  • операция, которая будет выполнена в этом функциональном вызове, зависит от того параметра oper, с которым был сконструирован объект;

  • функциональный вызов возвращает значение результата операции;

  • созданный временный объект, сразу же после этого разрушается (если бы у него был описан деструктор, то он бы вызывался в этой точке);

И в итоге мы получаем:

функтор, с++ для начинающих, функциональный объект, библиотека стл, stl

Но особо широкое применение функторы приобрели в алгоритмах STL, рассмотренных ранее, когда они передаются в вызов в качестве параметра, вместо функции, определяющей действие или предикат алгоритма.

Рассылка новых уроков по программированию:

Дата
Страница
Функциональные объекты (функторы) C++. STL Часть 11
Рейтинг
51star1star1star1star1star
Olej

Об авторе Olej

Стаж практических программных разработок около 40 лет. Преподаватель международной софтверной компании Global Logic. Постоянный автор публикаций IBM Developer Works. Научный редактор книжного издательства компьютерной литературы "Символ-Плюс", Санкт-Петербург.

Функциональные объекты. STL (часть 11): 3 комментария

  1. А почему в первом примере символ : стоит перед словом public? Поясните, пожалуйста)

    1. Это уже из другого раздела C++: классы, области видимости.
      В примере private относится к видимости базового класса: доступ к базовому классу существует только изнутри класса summator.
      Квалификатор public дальше уже определён внутри класса, и относится к функциям членам, объявленным после него: конструктору и оператору (). Он показывает что эти функции члены видимы и могут быть использованы в любом месте программы.

      В данном примере всё это не так важно, но это отдельная и важная часть языка C++.

Добавить комментарий

Код размещайте в тегах: <pre class="lang:c++ decode:true ">YOUR CODE</pre>