文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何进行C++智能指针的实现

2023-06-06 04:42

关注

本篇文章为大家展示了如何进行C++智能指针的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

自己根据http://blog.csdn.net/lf_2016/article/details/52430895这人的博客做了修改,并对代码做详细的注解
,具体如下:


#include

//删除器类定义,当然也可以定义其他删除器
struct DefaultDel{
    //重载()函数运算符,像调用函数一样调用该类的实例
    void operator()(void *ptr){
        if(ptr==nullptr){
            std::cout<<"fuck ,you shou give a valid ptr!"<<std::endl;



        }else{
            delete ptr;
        }
        std::cout<<"ptr have been delted!"<<std::endl;

    }

};
//D这里表示删除器,D是一个类,重载了函数调用操作符,即可以像函数一样使用这个类
template  class SharedPtr {
public:
    //这里设置了默认删除器为del函数
    SharedPtr(T* ptr,D del = DefaultDel());


    //为什么需要复制构造函数和赋值构造函数是因为一个对象可以被多个智能指针指向,而指向只能通过赋值和拷贝做到
    //拷贝构造函数
    SharedPtr(const SharedPtr &sp);
    //赋值运算符重载
    SharedPtr& operator=(const SharedPtr &sp);
    //析构函数
    ~SharedPtr();

    //为什么要重载*和->,是因为智能指针要实现与普通指针一样的操作
    T& operator*();
    T* operator->();
    T* _ptr;

private:
    void release(){
        if(--(*_pCount)==0){
            _del(_ptr);
            delete _pCount;
            _ptr=nullptr;
            _pCount=nullptr;



        }


    }

    int* _pCount;
    D _del;
    //static int _pCount;

};

//构造函数初始化
//ShardPtr sp(new int(12),DefaultDel());
template
SharedPtr::SharedPtr(T* ptr,D del)
:_ptr(ptr),_pCount(new int(1)),_del(del){}


//析构函数,调用release释放资源
template
SharedPtr::~SharedPtr(){

    release();

}



template
SharedPtr::SharedPtr(const SharedPtr &ps){
        _ptr = ps._ptr;

        _pCount=ps._pCount;
        (*_pCount)++;
        //这里为什么不用下面这种方式是智能指针的计数器是共享的,当然把_pCount设置为int静态类型更好
        //_pCount=ps->_pCount+1;
        //这里为什么不用下面这种方式是因为构造函数已经指定了删除器,当然,复制一个也是可以,但是没必要
        //_del=ps._del;
}
template
SharedPtr& SharedPtr::operator=(const SharedPtr &ps){
    if(this != &ps){
        _pCount=ps._pCount;
        (*_pCount)++;
        _ptr = ps._ptr;

    }
    return *this;

}
template
T& SharedPtr::operator*(){

    return *_ptr;


}
template
T* SharedPtr::operator->(){

    return _ptr;

}



void test(){

    SharedPtr sp(new int(1));
    //这里传了一个简单的删除器,DefaultDel实例
    SharedPtr sp1((int *)malloc(sizeof(int)),DefaultDel());

    SharedPtr sa(new int(2));
    sa=sp;
    //这个应该输出为1
    std::cout<<(*sa)<<std::endl;


}
int main()
{
    test();

    std::cout << "Hello world!" << std::endl;
    system("pause");
    return 0;
}


具体效果如下:

</std::endl;
</std::endl;
</std::endl;

上述内容就是如何进行C++智能指针的实现,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯