unique_ptr实现示例
template <typename T>
class unique_ptr {
public:
// 默认构造函数
unique_ptr() noexcept : ptr_(nullptr) {}
// 构造函数,接受一个指针
explicit unique_ptr(T* ptr) noexcept : ptr_(ptr) {}
// 析构函数
~unique_ptr() {
delete ptr_;
}
// 禁用拷贝构造函数和拷贝赋值操作符
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
// 移动构造函数
unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) {
other.ptr_ = nullptr;
}
// 移动赋值操作符
unique_ptr& operator=(unique_ptr&& other) noexcept {
if (this != &other) {
delete ptr_;
ptr_ = other.ptr_;
other.ptr_ = nullptr;
}
return *this;
}
// 重置指针
void reset(T* ptr = nullptr) noexcept {
delete ptr_;
ptr_ = ptr;
}
// 获取指针
T* get() const noexcept {
return ptr_;
}
// 访问对象的成员操作符
T* operator->() const noexcept {
return ptr_;
}
// 解引用操作符
T& operator*() const noexcept {
return *ptr_;
}
// 隐式转换为bool类型,判断指针是否为空
explicit operator bool() const noexcept {
return ptr_ != nullptr;
}
private:
T* ptr_;
};
举例
std::unique_ptr<framePool> framePool_;
if(!framePool_){
framePool_.reset(new framePool());
}
智能指针判空处理
!framePool_仍然使用了std::unique_ptr的隐式转换为bool类型的成员函数。
如果framePool_持有一个有效的指针(非空),则转换结果为false,否则为true。
reset
为unique_ptr的显式成员函数。
网友评论