标签:若是 分享图片 好的 int bubuko operator .com 复制 成功
template<class T> class Smart_ptr { public: Smart_ptr(T*ptr); Smart_ptr(const Smart_ptr &ptr);//拷贝构造函数 ~Smart_ptr();//析构函数 int get_cnt();//获得当前代理原指针的智能指针个数 Smart_ptr& operator=(const Smart_ptr&ptr);//赋值操作 T& operator *();//指针操作 T* operator ->();//指针操作 private: T*_ptr; int*_cnt; }; template<class T> Smart_ptr<T>::Smart_ptr(T*ptr):_ptr(ptr) {//判断参数指针是否为空;不为空,计数+1 if (_ptr) _cnt = new int(1); else _cnt = new int(0); } template<class T> Smart_ptr<T>::Smart_ptr(const Smart_ptr &ptr) {//复制构造函数,复制成功,计数加1 if (this != &ptr) { this->_ptr = ptr._ptr; this->_cnt = ptr._cnt; (*this->_cnt)++; } } template<class T> Smart_ptr<T>::~Smart_ptr() {//若当前的智能指针是最后一个代理指针,负责销毁原指针 (*this->_cnt)--; if ((*this->_cnt) == 0) { delete this->_cnt; delete this->_ptr; _cnt = nullptr; _ptr = nullptr; } } template<class T> Smart_ptr<T>& Smart_ptr<T>::operator=(const Smart_ptr&ptr) {//1:若赋值前后代理的指针是一样的,直接返回即可2:先判断当前的智能指针是否为最后一个代理原指针的智能指针,若是,销毁原指针; if (this->_ptr == ptr._ptr)return *this;//3:当前智能指针将代理一个新的指针 if (this->_ptr != nullptr) { (*this->_cnt)--; if (*this->_cnt == 0) { delete this->_cnt; delete this->_ptr; } } this->_cnt = ptr._cnt; this->_ptr = ptr._ptr; (*this->_cnt)++; return *this; } template<class T> T& Smart_ptr<T>::operator *() {//指针操作 return *(this->_ptr); } template<class T> T* Smart_ptr<T>::operator->() {//指针操作 return this->_ptr; } template<class T> int Smart_ptr<T>::get_cnt() { return *this->_cnt; }
main函数:
int main() { Smart_ptr<int>sp1(new int(1)); cout <<"sp1.cnt:"<< sp1.get_cnt() << endl; Smart_ptr<int>sp2(sp1); cout << "sp1.cnt:" << sp1.get_cnt() << endl; Smart_ptr<int>sp3(new int(10)); cout << "sp3.cnt:" << sp3.get_cnt() << endl;; sp3 = sp2; cout << "sp3.cnt:" << sp3.get_cnt() << endl; return 0; }
调用结果:
标签:若是 分享图片 好的 int bubuko operator .com 复制 成功
原文地址:https://www.cnblogs.com/ZefengYao/p/9465341.html