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