智能指针(引用计数版)
来源:互联网 发布:qq无限加人软件 编辑:程序博客网 时间:2024/06/05 09:06
#include<iostream>using namespace std;template<class T> class smartPoiter;template<class T>class u_ptr{private:int num;T *ptr; u_ptr(T* p): num(1),ptr(p) {cout << "创建" << endl;} ~u_ptr(){delete ptr;} friend class smartPoiter<T>;};template<class T>class smartPoiter{private:u_ptr<T>* poiter;public:smartPoiter(T* p = 0):poiter(new u_ptr<T>(p)) {} smartPoiter(smartPoiter& rhs): poiter(rhs.poiter){++(poiter->num);cout << "拷贝构造 还有" << poiter->num << endl;} smartPoiter& operator=(const smartPoiter& rhs); T* operator->() const //const表明不能修改主调对象 {return(poiter->ptr);}T& operator*() const{return(*(poiter->ptr));}~smartPoiter(){if(--(poiter->num) == 0){delete poiter;cout << "全部删除" << endl;}else{ cout << "还有" << poiter->num << "个智能指针" << endl;}}};//rhs的应用次数加1,主调对象减1 template<class T>smartPoiter<T>& smartPoiter<T>::operator=(const smartPoiter<T>& rhs) { ++(rhs.poiter->num); //这种写法还是可以 if(--(poiter->num) == 0){ delete poiter;}poiter = rhs.poiter;return(*this);}struct point{int x,y;point(int a,int b): x(a),y(b) {}};int main(){smartPoiter<point> p(new point(5,6)); cout << p->x << " " << p->y << endl; smartPoiter<point> p1 = p; cout << p1->x << " " << p1->y << endl;//p = p; //测试自我复制 cout << p->x << " " << p->y << endl;cout << (*p).x << " " << (*p).y << endl; return(0);}