#include <iostream>
template <typename T> class MyArray{
T* arr;
size_t size;
public:
MyArray(size_t size): size(size) {
arr = new T[size];
}
MyArray(T* ptr, size_t size ):size(size), arr(ptr) {}
// деструктор
~MyArray(){
if(arr == nullptr) return;
delete[] arr;
}
// оператор перемещающего присваивания
MyArray& operator=(T&& src) noexcept {
arr = src.arr;
size = src.size;
src.arr = nullptr;
src.size = 0;
return *this;
}
// конструктор перемещения
MyArray(MyArray&& src) noexcept:size(src.size), arr(src.arr) {
src.arr = nullptr;
src.size = 0;
}
T& operator[](size_t idx) {
if(idx > size - 1 || idx < 0) throw std::out_of_range("Index is out of range");
return arr[idx];
}
};
int main() {
int* p = new int[5]{0,1,2,3,4};
MyArray<int> a{p, 5};
a[0] = 5;
std::cout << a[0] << std::endl;
MyArray<int> b(std::move(a));
std::cout << b[0];
}
Здесь, следуя правилу пяти, хорошо было бы также реализовать конструктор копирования и оператор копирующего присваивания.