C++新特性18_智能指针的简易实现及添加模板(结合引用计数和写时拷贝对智能指针进行优化;考虑到智能指针的通用性,使用类模板,并进行测试)

前面已经讲了什么是智能指针,但是还不是很好用,需要不断的进行改进,可以融合前面提到的引用计数和写时拷贝,为智能指针增加新的功能。

1.智能指针的实现及添加模板

我们在前面自己做一个智能指针,让其帮助我们管理资源。但是这并不通用,只针对CStudent对象指针,因此,我们可以为其添加上模板的技术,这样让其更加通用。

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

//智能指针
//1.用起来像指针
//2.会自己对资源进行释放

class CStudent
{
public:
	CStudent()
	{

	}

	void test()
	{
		cout << "CStudent" << endl;
	}

private:
	char* m_pszBuf;
	int   m_nSex;
};

template<typename T>
class CSmartPtr;

//添加模板
template<typename T>

//引用计数器
class CRefCount
{
	friend class CSmartPtr<T>;

	CRefCount(T* pStu)
	{
		m_pObj = pStu;
		m_nCount = 1;
	}

	~CRefCount()
	{
		delete m_pObj;
		m_pObj = NULL;
	}
	//增加引用时加1
	void AddRef()
	{
		m_nCount++;
	}
	//引用为0时释放
	void Release()
	{
		if (--m_nCount == 0)
		{
			//这么写就表示自己一定是个堆对象
			delete this;
		}
	}

private:
	T* m_pObj;
	int m_nCount;
};

//智能指针
//致命问题,CSmartPtr表达的类型是固定的,是CStudent,需要添加模板
template<typename T>
class CSmartPtr
{
public:

	CSmartPtr()
	{
		m_pRef = NULL;
	}

	CSmartPtr(T* pStu)
	{
		m_pRef = new CRefCount <T>(pStu);
	}

	~CSmartPtr()
	{
		m_pRef->Release();
	}

	CSmartPtr(CSmartPtr& obj)
	{
		m_pRef = obj.m_pRef;
		m_pRef->AddRef();

	}

	CSmartPtr& operator=(CSmartPtr& obj)
	{
		if (m_pRef == obj.m_pRef)
		{
			return *this;
		}

		if (m_pRef != NULL)
		{
			m_pRef->Release();
		}

		m_pRef = obj.m_pRef;
		m_pRef->AddRef();


		return *this;
	}

	void test2()
	{
		cout << "test2" << endl;
	}

	T* operator->()
	{
		return m_pRef->m_pObj;
	}

	T** operator&()
	{
		return &m_pRef->m_pObj;
	}

	T& operator*()
	{
		return *m_pRef->m_pObj;
	}

	operator T*()
	{
		return m_pRef->m_pObj;
	}


	//   operator CStudent()
	//   {
	//     return *m_pStu;
	//   }

private:
	//只能new出来
	CRefCount<T>* m_pRef;
};

class CTest 
{
public:
	CTest() {}
};

int main(int argc, char* argv[])
{
	CStudent* pStu = new CStudent();
	CSmartPtr <CStudent> sp1(pStu);
	CSmartPtr <CStudent> sp2(new CStudent()); //拷贝构造

	sp2 = sp1; //运算符重载

	//测试可以使用于CTest指针
	CSmartPtr<CTest>sp3(new CTest);

	return 0;
}

上述代码sp1和sp2的具体构造析构过程如下图所示:
在这里插入图片描述
有需要下载该思维导图的可以从以下链接下载:C++新特性18-智能指针的简易实现及添加模板思维导图

2.学习视频地址:智能指针的简易实现及添加模板
3.学习笔记:智能指针的简易实现及添加模板笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值