template <typename T> class SharedPtr { private: size_t* m_count_; T* m_ptr_; public: //构造函数 SharedPtr() : m_ptr_(nullptr), m_count_(new size_t) {} SharedPtr(T* ptr) : m_ptr_(ptr), m_count_(new size_t) { m_count_ = 1; } //析构函数 ~SharedPtr() { --(*m_count_); if (*m_count_ == 0) { delete m_ptr_; delete m_count_; m_ptr_ = nullptr; m_count_ = nullptr; } } //拷贝构造函数 SharedPtr(const SharedPtr& ptr) { m_count_ = ptr.m_count_; m_ptr_ = ptr.m_ptr_; ++(*m_count_); } //拷贝赋值运算 void operator=(const SharedPtr& ptr) { SharedPtr(std::move(ptr)); } //移动构造函数 SharedPtr(SharedPtr&& ptr) : m_ptr_(ptr.m_ptr_), m_count_(ptr.m_count_) { ++(*m_count_); } //移动赋值运算 void operator=(SharedPtr&& ptr) { SharedPtr(std::move(ptr)); } //解引用 T& operator*() { return *m_ptr_; } //箭头运算 T* operator->() { return m_ptr_; } //᯿载bool操作符 operator bool() { return m_ptr_ == nullptr; } T* get() { return m_ptr_; } size_t use_count() { return *m_count_; } bool unique() { return *m_count_ == 1; } void swap(SharedPtr& ptr) { std::swap(*this, ptr); } };
本文为原创文章,转载请注明出处!