探索智能指针

来源:互联网 发布:oracle 恢复数据 编辑:程序博客网 时间:2024/05/18 01:03

代码如下,不过这个智能指针有个缺陷,就是只能指向在堆中创建的对象,加以修改后可以改成只能指向在栈中创建的对象,但是无法兼顾两种情况(如果要兼顾两种情况,则智能指针只能指向对象的新建副本,这又失去了指针原有的含义,so...)

#include <iostream>using namespace std;class Object//能被智能指针所指的类{public:void ShowAddress(){cout << "对象的地址为"<<this <<endl ;}~Object(){cout <<"地址为:" <<this <<"的对象释放完毕" <<endl;}void SayHello(){cout <<"Hello world!" <<endl;}};class CPtr//智能代理指针{private:Object* mRealPtr;int mUse;public:friend class SmartPoiter;CPtr(Object* ptr){mRealPtr = ptr;//修改词句,让mRealPtr指向对象的副本,则可以兼顾既可以指向堆,也可以指向栈中的对象mUse = 1;}~CPtr(){cout << "对象引用次数为为0了,将导致释放智能代理指针,此过程也将导致对象释放" << endl;delete mRealPtr;//去掉词句,可以指向在栈中分配的对象}};class SmartPoiter//智能指针类{private:CPtr* mPtr;public:SmartPoiter(Object * p){mPtr = new CPtr(p);}SmartPoiter(SmartPoiter& o){if(this != &o){mPtr = o.mPtr;++(mPtr->mUse);}}SmartPoiter& operator =(SmartPoiter& o){if(this != &o){mPtr = o.mPtr;++(mPtr->mUse);}return *this;}~SmartPoiter(){cout << "析构智能指针对象,释放后引用对象的引用计数为"<< --(mPtr->mUse) << endl;if(mPtr->mUse == 0)delete mPtr;}void ShowAddress(){cout <<"这个智能指针对象指向的对象的地址为"<< mPtr->mRealPtr <<"  这个引用对象的使用计数为" << mPtr->mUse << endl;}//使其支持指针操作Object& operator *()//重载*,以模拟指针操作{return *(mPtr->mRealPtr);}Object* operator->()//重载->,以模拟指针操作{return mPtr->mRealPtr;}};int main(){Object* ob = new Object();ob ->ShowAddress();SmartPoiter A(ob);A.ShowAddress();SmartPoiter B(A);B.ShowAddress();SmartPoiter C = A;C.ShowAddress();A = A;//测试自我赋值问题A.ShowAddress();B.ShowAddress();C.ShowAddress();(*A).ShowAddress();B->ShowAddress();B->SayHello();return 1;}

运行结果如下



原创粉丝点击