在介紹scoped_ptr以前,咱們先回顧一下前兩篇文章的內容.函數
首先,智能指針採用RAII機制,經過對象來管理指針,構造對象時,完成資源的初始化;析構對象時,對資源進行清理及汕尾.spa
auto_ptr,經過轉移管理權來完成對象的拷貝與賦值,在實際開發中並不實用.指針
回顧完智能指針的背景及auto_ptr的特性以後,本文來介紹scoped_ptr的實現原理及特性.code
scoped_ptr與auto_ptr相似,但最大的區別就是它不能轉讓管理權.也就是說,scoped_ptr禁止用戶進行拷貝與賦值.對象
誒?當我瞭解到這裏的時候,那麼問題來了:scoped_ptr是經過什麼方法來作到禁止用戶進行拷貝與賦值呢?ci
換句話說:C++中有什麼方法能夠禁止一個類進行拷貝構造和賦值呢?資源
那麼我第一時間想到的是:既然禁止你進行拷貝和賦值,那我不寫相應函數不就好了?開發
在C++中,若是你不定義拷貝構造函數/賦值運算符重載函數的話,當你在調用時,系統會自動默認生成相應的函數.io
但,系統默認生成的函數,完成的僅僅是值的拷貝,即淺拷貝!(固然,深淺拷貝的問題,就不在這裏多說了,之後再談.)table
也就是說,這種方法絕對沒辦法禁止一個類進行拷貝構造與賦值.
此時,我忽然靈光一現:想起了《Effective C++》中某條款提到了這個,其實要作的很簡單:
咱們只需把拷貝構造函數與賦值運算符重載的訪問限定符設置爲private,而且只給出其聲明,就像這樣:
1 2 3 4 5 |
|
所以,scoped_ptr的"核心技術",再次被咱們所剖析、掌握!
最終,給出我寫的精簡版代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|