unique_ptr實(shí)現(xiàn)示例
template <typename T>
class unique_ptr {
public:
// 默認(rèn)構(gòu)造函數(shù)
unique_ptr() noexcept : ptr_(nullptr) {}
// 構(gòu)造函數(shù)雏胃,接受一個(gè)指針
explicit unique_ptr(T* ptr) noexcept : ptr_(ptr) {}
// 析構(gòu)函數(shù)
~unique_ptr() {
delete ptr_;
}
// 禁用拷貝構(gòu)造函數(shù)和拷貝賦值操作符
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
// 移動(dòng)構(gòu)造函數(shù)
unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) {
other.ptr_ = nullptr;
}
// 移動(dòng)賦值操作符
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_;
}
// 訪問(wèn)對(duì)象的成員操作符
T* operator->() const noexcept {
return ptr_;
}
// 解引用操作符
T& operator*() const noexcept {
return *ptr_;
}
// 隱式轉(zhuǎn)換為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的隱式轉(zhuǎn)換為bool類型的成員函數(shù)志鞍。
如果framePool_持有一個(gè)有效的指針(非空)瞭亮,則轉(zhuǎn)換結(jié)果為false,否則為true固棚。
reset
為unique_ptr的顯式成員函數(shù)统翩。