auto_ptr類的源碼註解

源碼及註釋如下,這比記憶語法好多了!個人認爲,auto_ptr類設計地不行,比如都不能作爲參數傳遞(傳遞後實參就沒用了),失去了C指針的經典優勢!

// auto_ptr類的簡化版,刪除了有關auto_ptr_ref及auto_ptr<_Other>的一些成員函數

template<class ElemType>
class auto_ptr
{
public:
	typedef auto_ptr<ElemType> ClassType;

	explicit auto_ptr(ElemType *_Ptr = 0) _THROW0()
		: p(_Ptr)										//  若有實參,則必須直接初始化,因爲參數是指針,避免隱式轉換
	{
	}

	auto_ptr(ClassType& _Right) _THROW0()				// 複製構造函數
		: p(_Right.release())							// 形參是引用類型,參數釋放(置爲NULL,成爲未綁定的),轉移所有權
	{
	}

	ElemType *release() _THROW0()
	{
		ElemType *_Tmp = p;
		p = 0;											// 1、使自己成爲未綁定的
		return (_Tmp);									// 2、返回自己所保存的指針
	}

	void reset(ElemType *_Ptr = 0)
	{
		if (_Ptr != p)									// 如果_Ptr與自己保存的指針值不同,
			delete p;									// 3、則刪除p指向的對象,
		p = _Ptr;	// 這句最好也放到if裏				// 4、且將_Ptr綁定到p
	}

	ClassType& operator=(ClassType& _Right) _THROW0()	// 重載賦值運算符
	{
		reset(_Right.release());						// 注意形參是引用類型,過程見上面的1、2、3、4
		return (*this);
	}

	~auto_ptr()
	{
		delete p;										// 自動調用delete,所以不能綁定到動態分配的數組,是個缺陷。
	}

	ElemType *get() const _THROW0()
	{
		return (p);										// 返回自己保存的指針
	}

	ElemType *operator->() const _THROW0()				// 返回保存的指針
	{ // 還有待研究
#if _ITERATOR_DEBUG_LEVEL == 2
		if (p == 0)
			_DEBUG_ERROR("auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */

		return (get());									// 爲什麼不直接return p?
	}

	ElemType& operator*() const _THROW0()
	{													// 返回所綁定對象的引用
#if _ITERATOR_DEBUG_LEVEL == 2
		if (p == 0)
			_DEBUG_ERROR("auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */

		return (*get());								//  爲什麼不直接return *p?
	}

private:
	ElemType *p;										// 保存的指針
};

以上源碼是Plauger寫的,他是專門寫庫的。


2012/12/27

C++之父談新的智能指針類:

       "C++98只定義了一個智能指針類auto_ptr,它現在已經被廢棄了,C++11引入了新的智能指針類shared_ptr和最近添加的unique_ptr,兩者都兼容其它標準庫組件,因此你可以在標準容器內安全保存這些智能指針,並使用標準算法操作它們。"


 

 

 

發佈了80 篇原創文章 · 獲贊 11 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章