Глава 19. Классы-шаблоны_______________________________527

При объявлении переменной типа INT_VECTOR автоматически вызывается конструктор; в остальном объекты этого класса функционируют практически так же, как и все другие массивы.

INT_VECTOR v( 100);

vt0] ° 3;

//.... int t = v[0];

Чтобы преобразовать реализацию для целочисленного вектора в класс-шаблон, следует определить, что именно в этом классе легче всего параметризовать.

Так как мы работаем в 32-разрядной операционной системе, то мы имеем возможность манипулировать со значительно большими по размеру статическими объектами, чем в 16-разрядной. Это обстоятельство позволяет нам параметризовать и тип данных, как обычно делается, и размер вектора. Благодаря этому мы сократим затраты на создание объектов вектора (поскольку выделение и освобождение памяти — операции дорогостоящие). Таким образом, мы получим класс:

template <class Т, unsigned long SIZE = 100>

class VECTOR

(

public:

// Конструктор; деструктор здесь не требуется

VECTOR () П;

Т& operator [] ( unsigned long j)

(return j < SIZE ? data[j] : data [SIZE] /*фиктивное значение*/;} private:

T data [SIZE+1];

// возможно, копирование придется заблокировать );

Объявлять экземпляры этого вектора для любых типов данных настолько же просто, как и массивы типа INT_VECTOR. Как и в случае функций-шаблонов, для тех типов данных, которые требуют особой обработки, можно создавать специальные версии классов-шаблонов.

Заметьте, что для создания экземпляра такого объекта требуется совсем немного. Вот пример определения целочисленного массива с теми же границами, что и массив типа INT_VECTOR в предыдущем примере.

VECTOR<int, 100> iv;

for( unsigned long j » 0; j < 100; j++) iv[jl = j;

А вот пример другого типа:

VECTOR<char*, 50> sv;

sv[0] = "Это может привести к ошибкам, потому что присваивание 4>для char* копирует значение указателя.";