用智能指针写动态数组模版
时间: 2023-06-26 08:10:29 浏览: 93
介绍一个模板动态数组
4星 · 用户满意度95%
以下是使用智能指针实现动态数组模板的示例代码:
```c++
#include <memory>
template<typename T>
class DynamicArray {
public:
// 构造函数
explicit DynamicArray(size_t size = 0) : size_(size), data_(size ? new T[size] : nullptr) {}
// 拷贝构造函数
DynamicArray(const DynamicArray& other) : size_(other.size_), data_(other.size_ ? new T[other.size_] : nullptr) {
std::copy(other.data_.get(), other.data_.get() + size_, data_.get());
}
// 移动构造函数
DynamicArray(DynamicArray&& other) noexcept : size_(other.size_), data_(std::move(other.data_)) {
other.size_ = 0;
}
// 拷贝赋值运算符
DynamicArray& operator=(const DynamicArray& other) {
if (this != &other) {
DynamicArray tmp(other);
std::swap(size_, tmp.size_);
std::swap(data_, tmp.data_);
}
return *this;
}
// 移动赋值运算符
DynamicArray& operator=(DynamicArray&& other) noexcept {
if (this != &other) {
size_ = other.size_;
data_ = std::move(other.data_);
other.size_ = 0;
}
return *this;
}
// 析构函数
~DynamicArray() = default;
// 访问元素
T& operator[](size_t index) { return data_.get()[index]; }
const T& operator[](size_t index) const { return data_.get()[index]; }
// 大小
size_t size() const { return size_; }
// 交换
void swap(DynamicArray& other) noexcept {
std::swap(size_, other.size_);
std::swap(data_, other.data_);
}
private:
size_t size_;
std::unique_ptr<T[]> data_;
};
```
在上面的代码中,我们使用了 `std::unique_ptr` 来管理动态数组内存。这样做的好处是可以避免手动管理内存带来的麻烦和错误,同时也可以有效避免内存泄漏等问题。我们在构造函数中使用了 `new` 来分配内存,并在析构函数中使用了 `default` 来自动释放内存。在拷贝构造函数和赋值运算符中,我们使用了 `std::copy` 和 `std::swap` 来实现深拷贝和移动语义。最后,我们还提供了一个 `swap` 函数来实现快速交换两个数组。
阅读全文