实现动态数组类模板,要求: 重载[]、<<运算符,实现普通构造函数、复制构造函数等; 重载[]运算符时要处理越界异常,并用智能指针避免内存泄露;
时间: 2023-06-26 11:09:22 浏览: 129
面向对象作业1-构造函数+运算符重载.docx
下面是一个实现动态数组类模板的代码示例:
```c++
#include <iostream>
#include <memory>
template<typename T>
class DynamicArray {
public:
// 普通构造函数
DynamicArray() : m_length(0), m_data(nullptr) {}
// 带参构造函数
DynamicArray(int length) : m_length(length) {
m_data = std::make_unique<T[]>(m_length);
}
// 复制构造函数
DynamicArray(const DynamicArray& other) : m_length(other.m_length) {
m_data = std::make_unique<T[]>(m_length);
for (int i = 0; i < m_length; i++) {
m_data[i] = other.m_data[i];
}
}
// 重载[]运算符
T& operator[](int index) {
if (index < 0 || index >= m_length) {
throw std::out_of_range("Index out of range");
}
return m_data[index];
}
// 重载<<运算符
friend std::ostream& operator<<(std::ostream& os, const DynamicArray<T>& arr) {
for (int i = 0; i < arr.m_length; i++) {
os << arr.m_data[i] << " ";
}
return os;
}
private:
int m_length;
std::unique_ptr<T[]> m_data;
};
int main() {
DynamicArray<int> arr(5);
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
}
std::cout << arr << std::endl;
DynamicArray<int> arr2 = arr;
std::cout << arr2 << std::endl;
try {
std::cout << arr[6] << std::endl; // 抛出越界异常
}
catch (const std::out_of_range& e) {
std::cout << e.what() << std::endl;
}
return 0;
}
```
在上面的代码中,我们用智能指针 `std::unique_ptr<T[]>` 管理动态分配的数组内存,以避免内存泄漏。在重载[]运算符时,我们检查索引是否越界,如果越界则抛出 `std::out_of_range` 异常;在重载<<运算符时,我们直接输出数组的元素。我们还实现了普通构造函数、带参构造函数和复制构造函数,以满足不同的对象创建需求。
阅读全文