千家信息网

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

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇文章为大家展示了如何进行C++智能指针的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。自己根据http://blog.csdn.net/lf_2016
千家信息网最后更新 2025年01月31日如何进行C++智能指针的实现

本篇文章为大家展示了如何进行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!"<


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

};
//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)<

}
int main()
{
test();

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


具体效果如下:

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

函数 指针 智能 C++ 不用 内容 实例 技能 拷贝 指向 方式 知识 运算符 运算 普通 简明 必要 简明扼要 代码 博客 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器管理口远程 搞软件开发的年薪多少钱 网络安全会成为下一个风口吗 四川自助缴费终端软件开发 无锡浪潮服务器维修中心电话 求生之路2修仙服务器指令 数据库原理实验6储存过程 重庆hp服务器维修维保哪家好 部落冲突的服务器受谁管理 安徽服务器回收推荐虚拟主机 一个阿里云账号可以有几个服务器 计算机网络技术注意事项 分布式测网络技术教学 达梦数据库目录如何修改 丹东精益管理软件开发 做工精细的app软件开发 分区助手服务器版 绿色 java怎么将代码上传到服务器 汽车网络安全名词解释 行业软件开发的上市公司 流氓软件开发商 网络安全管理员 四级 并网电厂网络安全 徐州通用软件开发配置 深圳学软件开发培训班 网络安全宣传周工会 免费数据库产品 服务器外包装箱尺寸 杭州企业软件开发费用是多少 行业软件开发的上市公司
0