Ваш конструктор копирования также выглядит неправильно, он не копирует содержимое массива.
Я согласен с Kerrek, что вы должны использовать vector
.Но поскольку вы, похоже, пытаетесь заново реализовать vector
для себя, вот простой «правильный» способ управления ресурсами в вашем классе, например:
class arr
{
public:
// switch order of data members, we want to initialize "len" first
int len;
int *arr1;
// default constructor
// you could use "new int[len]()" instead, to zero-initialize the array
arr() : len(5), arr1(new int[len]) {}
// constructor with size
arr(int size) : len(size), arr1(new int[len]) {}
// copy constructor
arr(const arr &rhs) : len(rhs.len), arr1(new int[len]) {
std::copy(rhs.arr1, rhs.arr1 + len, arr1);
}
// destructor
~arr() {
delete[] arr1; // *not* "delete", you *must* use "delete[]"
}
// swap function (this is useful, observe that it cannot throw)
void swap(arr &rhs) {
std::swap(len, rhs.len);
std::swap(arr1, rhs.arr1);
}
// assignment operator
arr &operator=(arr temp) { // parameter by value uses the copy ctor
// so, anything that could throw (the allocation) is complete,
// before we make any modifications to this object.
// see how useful "swap" is, and the fact it cannot throw?
swap(temp);
return *this;
}
// for C++11
// move constructor
arr(arr &&rhs) : len(rhs.len), arr1(rhs.arr1) {
rhs.arr1 = 0;
}
};
Кстати, названиечлен данных arr1
заставляет меня опасаться, что вы добавите второй массив позже.Не делайте этого, гораздо сложнее написать класс, который правильно управляет двумя ресурсами, чем написать класс, который правильно управляет одним ресурсом, и другой класс, в котором два из них являются членами данных.