這篇文章中c++ primer 用兩種智慧型指標舉例子
shared_ptr和unique_ptr如何指定刪除器的差異實際上就是這兩個類功能的差異。
我們先看一下如何定義shared_ptr的刪除器
學習自csdn的**
在建構函式的時候傳入函式的指標:
#include #include #include "template.h"
using namespace std;
class ******;
void deleter(****** *)
在建構函式的時候使用仿函式
我們可以這樣看乙個例子
class deleter
};// 建構函式傳遞自定義刪除器指標
int main()
我們通過運算子過載,可以將類過載成乙個類似與函式的呼叫方式
deleter del;
******* data = new ******();
del(data);
這樣也會觸發deleter function called
lambda表示式?
這個內容真的不是很懂,不知道什麼是lambda
std::shared_ptrp3(new sample[5], (sample *x) );
第一次聽說c++ 的這個東西
下面我們看一下這個lambda表示式:
原來lambda表示式就是乙個閉包,也就是我們俗話說的php中的匿名函式,基本是只用一次所以也不需要函式名字,js中也有閉包
乙個最簡單的lambda表示式
{} ();
void f()
int main()
如果說這個了解了那上面的函式非常容易看懂了
#include #include #include #include #include #include #include "template.h"
using namespace std;
class ******;
// 建構函式傳遞自定義刪除器指標
int main() );
return 0;
}
第四種方式是使用default_delete
std::shared_ptrp (new ******[5],std::default_delete());
我們再來看一下unique_ptr是如何指定刪除器的
unique_ptr 這種就不再贅述了,只是在模板中定義出函式,然後在傳入引數的時候做出實現就可以了
詳細的可以參考csdn
總結最後我們可以看出shared_ptr並不是直接將刪除器儲存為乙個成員,因為刪除器的型別直到執行的時候才會直到,實際上刪除器的型別我們可以隨時改變,unique_ptr的刪除器型別在編譯的時候就是知道的,unique_ptr避免了間接呼叫刪除器的開銷。通過執行時候繫結刪除器,shared_ptr使使用者過載刪除器更加方便。
C 模板與泛型程式設計
1 物件導向程式設計總是以顯式介面和執行時多型解決問題。模板及泛型世界不同,在此世界中顯式介面和執行時多型仍然存在,但重要性降低,反倒是隱式介面和編譯器多型移到前頭。執行時多型和編譯時多型 前者表示哪乙個虛函式該被繫結,後者表示哪乙個過載函式該被呼叫。顯式介面由函式的簽名式 函式名稱 引數型別 返回...
模板與泛型程式設計
模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...
模板與泛型程式設計
泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...