У попередніх обговореннях вже неодноразово з'являвся такий термін як функтор, але особливої актуальності він набуває стосовно алгоритмам. Тепер настав час розібратися з цим поняттям. Функтор - це скорочення від еункціональний об'єкт, представляє собою конструкцію, що дозволяє використовувати об'єкт класу як функцію. У C ++ для визначення функтора досить описати клас, в якому перевизначена операція ().
те, як з об'єкта утворюється функція, легко показати на такому простому прикладі:
Уже з такого простого прикладу видно наступне: операция () в класі може бути перевизначена (точніше визначена, оскільки вона не має реалізації за замовчуванням) з довільним числом, типом параметрів і типом значення, що повертається (або навіть зовсім без значення, що повертається). В підсумку:
Вигода функтора полягає в тому, що а). його можна параметризрвані при створенні об'єкта (перед викликом) використовуючи конструктор об'єкта з параметрами і б). може створюватися тимчасовий об'єкт виключно на час виконання функціонального виклику. Це ілюструється прикладом такого спрощеного целочисленного калькулятора:
Тут в рядку cout << обчислювати( опер )( op1, op2 ) дії виконуються послідовно:
створюється тимчасовий об'єкт класса обчислювати конструктором з параметром опер;
для цього об'єкта виконується метод () (функціональний виклик) з двома параметрами;
операция, яка буде виконана в цьому функціональному виклику, залежить від того параметра опер, з яким був сконструйований об'єкт;
функціональний виклик повертає значення результату операції;
створений тимчасовий об'єкт, відразу ж після цього руйнується (якби у нього був описаний деструктор, то він би викликався в цій точці);
І в результаті ми отримуємо:
Але особливо широке застосування функтори придбали в алгоритмах STL, розглянутих раніше, коли вони передаються в виклик в якості параметра, замість функції, визначальною дію або предикат алгоритму.
А чому в першому прикладі символ : стоїть перед словом public? Поясніть, будь ласка)
Тобто перед private)
Це вже з іншого розділу C ++: классы, області видимості.
У прикладі private відноситься до видимості базового класу: доступ до базового класу існує тільки зсередини класу summator.
Кваліфікатор public далі вже визначений всередині класса, і відноситься до функцій членам, оголошеним після нього: конструктору і оператору (). Він показує що ці функції члени видимі і можуть бути використані в будь-якому місці програми.
В даному прикладі все це не так важливо, але це окрема і важлива частина мови C ++.
t6d8rk