实现动态数组类模板,要求: 重载[]、<<运算符,实现普通构造函数、复制构造函数等; 重载[]运算符时要处理越界异常,并用智能指针避免内存泄露;
时间: 2023-11-27 14:55:13 浏览: 88
面向对象作业1-构造函数+运算符重载.docx
以下是动态数组类模板的实现,包含了所要求的功能:
```c++
#include <iostream>
#include <memory>
using namespace std;
template<typename T>
class DynamicArray {
private:
unique_ptr<T[]> data; // 使用智能指针管理动态数组内存,避免内存泄漏
int size;
public:
DynamicArray() : size(0), data(nullptr) {} // 默认构造函数
DynamicArray(int _size) : size(_size), data(new T[_size]) {} // 普通构造函数
DynamicArray(const DynamicArray<T>& other) : size(other.size), data(new T[other.size]) { // 复制构造函数
for (int i = 0; i < size; i++) {
data[i] = other.data[i];
}
}
~DynamicArray() {} // 析构函数,由unique_ptr自动管理内存
T& operator[](int index) { // 重载[]运算符
if (index < 0 || index >= size) {
throw out_of_range("Index out of range");
}
return data[index];
}
friend ostream& operator<<(ostream& os, const DynamicArray<T>& arr) { // 重载<<运算符
os << "[";
for (int i = 0; i < arr.size; i++) {
os << arr.data[i];
if (i != arr.size - 1) {
os << ", ";
}
}
os << "]";
return os;
}
};
int main() {
DynamicArray<int> arr(5);
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
}
cout << arr << endl;
try {
cout << arr[6] << endl;
} catch (const exception& e) {
cerr << e.what() << endl;
}
return 0;
}
```
这里使用了unique_ptr智能指针来管理动态数组内存,避免内存泄漏。重载[]运算符时,通过判断下标是否越界来抛出out_of_range异常。重载<<运算符时,输出动态数组内所有元素。
阅读全文