1.12. Введение в функциональные объекты

Существует другой способ решения задачи сортировки из предыдущего раз­дела. Хотя для такой простой задачи он и не нужен, обсуждаемые принци­пы являются важными для других более сложных случаев, поэтому не сто­ит пропускать этот раздел при чтении. Функциональным объектом называется класс, где определен оператор вызова, который записывается как operatorQ. От класса не требуется наличия каких-либо других членов. Да­вайте начнем с очень простого примера. (Здесь и далее мы пишем iostream.h вместо iostream, поскольку в последнем случае VC5 также требует наличия строчки using namespace std, a BC5, напротив, не позволяет использовать эту строчку, если не включаются типичные заголовки STL, такие как vector.)

II  funobj.cpp:   Очень простой функциональный объект. #include  <iostream.h>

class compare   { public:

int operator()(int x,   int y)const

{    return x > y;

} };

int main() {    compare v;

cout  « v(2,   15)   «  endl;                          //  Вывод:   О

cout  <<  compare()(5,   3)   <<  endl;   //  Вывод:   1

cout  <<  endl;

return  0; }

Так как для класса compare определен оператор вызова функции, operatorQ, с двумя параметрами типа int, мы можем использовать выражение v(2,15), где v - переменная этого класса. Это выражение на самом деле является сокра­щенной формой записи вместо v.operatorQ{2, 15) и таким образом приводит к вызову функции-члена operatorQ класса compare, возвращающей значение 0, поскольку 2 не больше 15. Второй вызов

compare 0(5,   3)

выглядит довольно необычно. Первая часть этой записи, compareQ, пред­ставляет собой вызов конструктора по умолчанию класса compare. Други­ми словами, выражение compareQ представляет объект типа compare, и за ним, как иу v, может следовать список аргументов, в этом примере (5, 3). Следующая программа, основывающаяся на использовании функциональ­ного объекта, эквивалентна программе dsortl из предыдущего раздела:

// dsort2 .срр: Сортировка в нисходящем порядке

//                        с использованием определенного нами

//    функционального объекта.

#include <iostream>

#include <algorithm>

using namespace std;

class compare  {

public:

bool operator()(int x, int у)const

{ return x > y;

} };

int main()

{  const int N = 8;

int a[N] =

{1234, 5432, 8943, 3346, 9831, 7842, 8863, 9820};


<< назад вперед >>