More Effective C++ 讀書摘要(auto_ptr的一個實現)

來源:互聯網
上載者:User

下面是兩個auot_ptr的實現。第一個版本文檔化了類的介面並在類的定義體外面實現了所有的成員函數。第二個版本將所有的成員函數都實現在定義體內了。

 

在風格上,第二個實現不如第一個,因為它沒有將類的介面從實現中分離出來。但是auto_ptr只是一個簡單的類,所以第二個實現比第一個清晰得多。

這是把auto_ptr的介面和實現分開的版本:
template<class T><br />class auto_ptr {<br />public:<br /> explicit auto_ptr(T *p = 0); // Item M5 有“explicitfor”<br /> // 的描述<br /> template<class U> // 拷貝建構函式成員模板<br /> auto_ptr(auto_ptr<U>& rhs); // (見Item M28):<br /> // 用另一個類型相容的<br /> // auto_ptr對象<br /> // 初始化一個新的auto_ptr對象<br /> ~auto_ptr();<br /> template<class U> // 賦值操作成員模板<br /> auto_ptr<T>& // (見Item M28):<br /> operator=(auto_ptr<U>& rhs); // 用另一個類型相容的<br /> // auto_ptr對象給它賦值<br /> T& operator*() const; // 見Item M28<br /> T* operator->() const; // 見Item M28<br /> T* get() const; // 返回包容指標的<br /> // 當前值<br /> T* release(); // 放棄包容指標的<br /> // 所有權,<br /> // 並返回其當前值<br /> void reset(T *p = 0); // 刪除包容指標,<br /> // 獲得指標p的所有權<br />private:<br /> T *pointee;<br />template<class U> // 讓所有的auto_ptr類<br />friend class auto_ptr<U>; // 成為友元<br />};</p><p>template<class T><br />inline auto_ptr<T>::auto_ptr(T *p)<br />: pointee(p)<br />{}</p><p>template<class T><br /> inline auto_ptr<T>::auto_ptr(auto_ptr<U>& rhs)<br /> : pointee(rhs.release())<br /> {}</p><p>template<class T><br />inline auto_ptr<T>::~auto_ptr()<br />{ delete pointee; }</p><p>template<class T><br /> template<class U><br /> inline auto_ptr<T>& auto_ptr<T>::operator=(auto_ptr<U>& rhs)<br /> {<br /> if (this != &rhs) reset(rhs.release());<br /> return *this;<br /> }</p><p>template<class T><br />inline T& auto_ptr<T>::operator*() const<br />{ return *pointee; }</p><p>template<class T><br />inline T* auto_ptr<T>::operator->() const<br />{ return pointee; }</p><p>template<class T><br />inline T* auto_ptr<T>::get() const<br />{ return pointee; }</p><p>template<class T><br />inline T* auto_ptr<T>::release()<br />{<br /> T *oldPointee = pointee;<br /> pointee = 0;<br /> return oldPointee;<br />}</p><p>template<class T><br />inline void auto_ptr<T>::reset(T *p)<br />{<br /> if (pointee != p) {<br /> delete pointee;<br /> pointee = p;<br /> }<br />}<br />

下面是將所有函數定義在類定義體內的auto_ptr模板。如你所見,它容易看懂:

template<class T><br />class auto_ptr {<br />public:<br /> explicit auto_ptr(T *p = 0): pointee(p) {}<br /> template<class U><br /> auto_ptr(auto_ptr<U>& rhs): pointee(rhs.release()) {}<br /> ~auto_ptr() { delete pointee; }<br /> template<class U><br /> auto_ptr<T>& operator=(auto_ptr<U>& rhs)<br /> {<br /> if (this != &rhs) reset(rhs.release());<br /> return *this;<br /> }<br /> T& operator*() const { return *pointee; }<br /> T* operator->() const { return pointee; }<br /> T* get() const { return pointee; }<br /> T* release()<br /> {<br /> T *oldPointee = pointee;<br /> pointee = 0;<br /> return oldPointee;<br /> }<br /> void reset(T *p = 0)<br /> {<br /> if (pointee != p) {<br /> delete pointee;<br /> pointee = p;<br /> }<br /> }<br /> private:<br /> T *pointee;<br /> template<class U> friend class auto_ptr<U>;<br /> };

如果你所用的編譯器還不支援“explicit”,可以安全地用#define取消它的存在:
#define explicit
這不會造成auto_ptr的任何功能減弱,但導致輕微的安全性減弱。詳見Item M5。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.