#include template class Array { public: // конструктор класса, который создает // Array размера size, заполненный значениями // value типа T. Считайте что у типа T есть // конструктор, который можно вызвать без // без параметров, либо он ему не нужен. // explicit Array(size_t size = 0, const T& value = T()) { this->table = static_cast(operator new[] (size * sizeof(T))); this->count = size; for (size_t i = 0; i < size; ++i) { //здесь память для объекта не выделяется, но инициализируется new (table + i) T(value); } } // Конструктор копирования, который создает // опию параметра. Считайте, что для типа // T определен оператор присваивания. // Array(const Array &array) { this->table = static_cast(operator new[] (array.size() * sizeof(T))); this->count = array.size(); for (size_t i = 0; i < count; ++i) { new (table + i) T(array[i]); } } // Деструктор, если он вам необходим. // ~Array() { for (size_t i = 0; i < count; ++i) { table[i].~T(); } operator delete[] (table); } // Оператор присваивания. // Array& operator=(const Array &array) { if (this != &array) { operator delete[] (table); /*this->table = new T[array.size()]; this->count = array.size(); for (size_t i = 0; i < count; ++i) { table[i] = array[i]; }*/ this->table = static_cast(operator new[] (array.size() * sizeof(T))); this->count = array.size(); for (size_t i = 0; i < count; ++i) { //здесь память для объекта не выделяется, но инициализируется new (table + i) T(array[i]); } } return *this; } // Возвращает размер массива (количество элементов). // size_t size() const { return count; } // const T& operator[](size_t) const // две версии оператора доступа по индексу. T& operator[](size_t index) { return table[index]; } T operator[](size_t index) const { return table[index]; } private: T* table; size_t count; };