本篇文章为大家展示了如何进行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++智能指针的实现,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。