程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> More Effective C++之智能指針

More Effective C++之智能指針

編輯:關於C++

智能指針具有非常強大的能力,謹慎而明智的選擇能帶來極大的好處。我不否認智能指針的能力,雖然我在之前的否認過auto_ptr。可能由於我自身能力的限制,體會不到auto_ptr的好處,但這樣的可能性我覺得已經不大了。但auto_ptr是最簡單的智能指針,在它的周圍存在大量的作品,這些作品包括Boost、Loki、ACE等等,但是可惜的是目前沒有一個我能夠說我很熟悉,那麼本篇只是作為一個入門,在此基礎上,應當閱讀Boost、Loki、ACE相關源碼。

Smart Pointer的核心是實現

template <class T>
T& SmartPointer<T>::operator*() const;
template <class T>
T& SmartPointer<T>::operator->() const;

Smart Pointer的構造和析構是一門藝術,由此而衍生出很多不同類型的Smart Pointer。千萬不要指望Smart Pointer的表現象原生指針,雖然可以通過隱式轉換來實現它,然而往往帶來的後果是災難性的。

Meyers給出了一個優雅的隱式轉換的辦法:

template<class T>
class TestTemplate
{
public:
TestTemplate(T* ptr = 0):pointee(ptr){}
template<class newType>
operator TestTemplate<newType>()
{
return TestTemplate<newType>(pointee);
}
private:
T* pointee;
};

可惜這樣的程序在VC6中無法通過編譯,似乎VC6不支持將novirtual member function聲明成templates,但是VC7可以。這裡地方需要注意四點技術:

(1)函數調用的自變量匹配規則

(2)隱式型別轉換函數

(3)template functions的暗自具現化

(4)member function templates。我承認,這有點太深入了。

在智能指針中const和non-const之間的轉化也是很大的學問,我看了Meyers使用unions來做實現。這不是我喜歡的做法,我覺得風險還是比較大的。

Smart Pointer值得使用麼?這不是我可以回答的問題,然而在以往的經驗中,我似乎很少用到。也許是我的孤陋造成了這樣的局面,但在更深層次來說,我需要閱讀更多的Smart Pointer的實現。而且更加重要的是需要學會對Smart Pointer的調試,這似乎並不簡單。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved