Глава 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* копирует значение указателя.";