Основы программирования на С++ для начинающих

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *