本篇文章為大家展示了如何進行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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。