`
bcyy
  • 浏览: 1809781 次
文章分类
社区版块
存档分类
最新评论

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,两者都兼容其它标准库组件,因此你可以在标准容器内安全保存这些智能指针,并使用标准算法操作它们。"


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics