【C++】智慧指標簡述(三):scoped_ptr
在介紹scoped_ptr之前,我們先回顧一下前兩篇文章的內容.
首先,智慧指標採用RAII機制,通過物件來管理指標,構造物件時,完成資源的初始化;析構物件時,對資源進行清理及汕尾.
auto_ptr,通過轉移管理權來完成物件的拷貝與賦值,在實際開發中並不實用.
回顧完智慧指標的背景及auto_ptr的特性之後,本文來介紹scoped_ptr的實現原理及特性.
scoped_ptr與auto_ptr類似,但最大的區別就是它不能轉讓管理權.也就是說,scoped_ptr禁止使用者進行拷貝與賦值.
誒?當我瞭解到這裡的時候,那麼問題來了:scoped_ptr是通過什麼方法來做到禁止使用者進行拷貝與賦值呢?
換句話說:C++中有什麼方法可以禁止一個類進行拷貝構造和賦值呢?
那麼我第一時間想到的是:既然禁止你進行拷貝和賦值,那我不寫相應函式不就行了?
在C++中,如果你不定義拷貝建構函式/賦值運算子過載函式的話,當你在呼叫時,系統會自動預設生成相應的函式.
但,系統預設生成的函式,完成的僅僅是值的拷貝,即淺拷貝!(當然,深淺拷貝的問題,就不在這裡多說了,以後再談.)
也就是說,這種方法絕對沒辦法禁止一個類進行拷貝構造與賦值.
此時,我突然靈光一現:想起了《Effective C++》中某條款提到了這個,其實要做的很簡單:
我們只需把拷貝建構函式與賦值運算子過載的訪問限定符設定為private,並且只給出其宣告,就像這樣:
1 2 3 4 5 |
const ScopedPtr& sp);
|
因此,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 |
|
<