c++(19)自定义的智能指针

这里主要是练习一下操作符重载。

1、什么是智能指针

从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期。

使用智能指针时要注意,在c++中,智能指针一共定义了4种:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。

这里仅对auto_ptr做一个练习

2、auto_ptr有什么特点

1、可以自动回收内存,2、可以直接访问指向对象的成员变量和成员函数。对于使用而言,记住这两条就够了。

3、实现自定义的智能指针MyAutoPtr

#include <iostream>
#include <cstring>
#include <memory>
using namespace std;

//智能指针特点:1、可以自动回收内存,2、可以直接访问指向对象的成员变量和成员函数
class AA
{
public:
    AA(int a)
	{
		cout<<"AA(int a) ...."<<endl;
		m_a = a;
	}
	
	~AA()
	{
		cout<<"~AA() ...."<<endl;
	}
	
	void print()
	{
		cout<<"m_a = "<<m_a<<endl;
	}
	
public:
    int m_a;
};

//标准模板类,提供了一个智能指针的实现
//需要#include <memory>  
//如下
void test_auto_ptr()
{
	//使用模板类,指向类AA
	//ptr指针可以直接访问AA对象的成员变量和成员函数
	auto_ptr<AA> ptr(new AA(10));
	ptr->print();
	
	//不需要delete释放,就可以自动调用AA的析构函数,释放空间
	//但是正常情况下,c++的new和delete成对出现,已经变成程序员的习惯。上面的写法有点别扭
}

//下面我们自己来实现一个智能指针,只针对类AA的智能指针MyAutoPtr
class MyAutoPtr
{
public:
    MyAutoPtr(AA *paa)
	{
		if (paa != NULL)
		{
			m_paa = paa;
		}
	}
	
	~MyAutoPtr()
	{
		if(m_paa != NULL)
		{
			delete m_paa;
			m_paa = NULL;
		}
	}
	
	//重载两种对象的访问方式 -> 和 *
	AA *operator->()
	{
		return m_paa;
	}
	
	AA &operator*()
	{
		return *m_paa;
	}
	
	
private:
    AA *m_paa;
};

int main(void)
{
	//test_auto_ptr();
	MyAutoPtr myptr(new AA(10));
	
	myptr->print();
	(*myptr).print();
	
	return 0;
}


这里其实缺失了一个模板类的使用,对于基本的功能是可以实现了。访问对象成员变量和成员函数的时候,注意两种使用方法,指针(->)和对象实例(.),通过操作符重载完成需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值