C++基础——智能指针

  1. 为什么要使用智能指针?

    因为c++常规中new完之后需要手动delete,而java中就不用管,所以就希望能够有一种机制在new完之后自动给delete释放掉

    A* p = new A;
    delete p;
    
  2. 怎么使用?

    #include <iostream>
    #include <memory>
    using namespace std;
    class A
    {
    public:
        A()
        {cout << "A() constructor" << endl;}
        ~A()
        {cout << "~A() destructor" << endl;}
        void func()
        {cout << "adsdsdsa" << endl;}
    };
    void foo()
    {
        auto_ptr<A> ptr(new A);
        //auto_ptr<A> 用A对模板实例化,实例化完就是一个具体的类,然后对对象ptr进行初始化   本质上重载 -> *
        ptr->func();
        //ptr是对象,但具有指针的特点
        (*ptr).func();
    }
    int main()
    {   foo();
        return 0;}
    
  3. 是怎么实现的?

    class Sp
    {
    public:
        Sp(A *p)
            :_p(p){}
        ~Sp(){delete _p;}
        A* operator->()//返回指针
        {return _p;}
        A& operator*()//返回引用,若返回对象会发生两次析构
        {return *_p;}
    private:
        A * _p;
    };
    void foo()
    {
        Sp sp(new A);//把new A的指针赋给了p,p又给了_p,sp是栈上的对象,当其离开栈时要析构就会调用析构,从而调用delete
        //但此时的sp不能访问到_p(还是私有的),希望对其再次封装,像指针一样
        sp->func();//sp.operator->()还是个指针,可以调用func,即sp.operator->()->func();根据a.operator+(b) <=> a+b可以把前面华为sp->->func,在一步合为sp->func
        //此时sp有了指针的功能,对象变指针
        (*sp).func();
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值