В предыдущих обсуждениях уже неоднократно мелькал такой термин как функтор, но особую актуальность он приобретает применительно к алгоритмам. Теперь пришло время разобраться с этим понятием. Функтор — это сокращение от функциональный объект, представляющий собой конструкцию, позволяющую использовать объект класса как функцию. В C++ для определения функтора достаточно описать класс, в котором переопределена операция ().
То, как из объекта образуется функция, легко показать на таком простом примере:
Уже из такого простого примера видно следующее: операция () в классе может быть переопределена (точнее определена, поскольку она не имеет реализации по умолчанию) с произвольным числом, типом параметров и типом возвращаемого значения (или даже вовсе без возвращаемого значения). В итоге:
Выгода функтора состоит в том, что а). его можно параметризовать при создании объекта (перед вызовом) используя конструктор объекта с параметрами и б). может создаваться временный объект исключительно на время выполнения функционального вызова. Это иллюстрируется примером такого упрощённого целочисленного калькулятора:
Здесь в строке cout << calculate( oper )( op1, op2 ) действия выполняются последовательно:
создаётся временный объект класса calculate конструктором с параметром oper;
для этого объекта выполняется метод () (функциональный вызов) с двумя параметрами;
операция, которая будет выполнена в этом функциональном вызове, зависит от того параметра oper, с которым был сконструирован объект;
функциональный вызов возвращает значение результата операции;
созданный временный объект, сразу же после этого разрушается (если бы у него был описан деструктор, то он бы вызывался в этой точке);
И в итоге мы получаем:
Но особо широкое применение функторы приобрели в алгоритмах STL, рассмотренных ранее, когда они передаются в вызов в качестве параметра, вместо функции, определяющей действие или предикат алгоритма.
А почему в первом примере символ : стоит перед словом public? Поясните, пожалуйста)
То есть перед private)
Это уже из другого раздела C++: классы, области видимости.
В примере private относится к видимости базового класса: доступ к базовому классу существует только изнутри класса summator.
Квалификатор public дальше уже определён внутри класса, и относится к функциям членам, объявленным после него: конструктору и оператору (). Он показывает что эти функции члены видимы и могут быть использованы в любом месте программы.
В данном примере всё это не так важно, но это отдельная и важная часть языка C++.
t6d8rk