И еще одно замечание: в перегруженной операции индексирования [ ] () не выполняется никакой проверки границ. Стандарт библиотеки STL не требует такой проверки, и она не включена в код. Это резонно, потому что, за исключением задаваемого пользователем диапазона, объект RangeArray ведет себя так же, как нормальный массив (вспомните, в обычных массивах С++ не выполняется никакой проверки границ). Конечно, если вы захотите, такую проверку можно добавить в операцию [ ] (). Далее приведена немного более сложная перегруженная операция присваивания = (). // Присваивает один контейнер другому, template <class Т, class А> RangeArray<T, А> & RangeArray<T, А>::operator=(const RangeArray<T, A> &o) { // Вызывает деструкторы для элементов в контейнере-приемнике. for(size_type i=0; i < size(); i++) a.destroy(&arrayptr[i]); // Освобождает исходную память, a.deallocate(arrayptr, size()); // Выделяет память для нового размера, arrayptr = a.allocate(о.size О); upperbound = о.upperbound; lowerbound = о.lowerbound; len = о.len; // Создает копию. for(size_type i=0; i < sizeO; i++) arrayptr[i] = о.arrayptr[i]; return *this; } Сначала она уничтожает созданные ранее объекты в контейнере-приемнике и освобождает отведенную им память. Далее выделяется память, достаточная для хранения содержимого объекта-источника. Затем устанавливаются соответствующие значения переменных-членов и копируются элементы. В конце возвращается ссылка на объект-приемник.
|