读书人

auto_ptr种的源码注解

发布时间: 2012-11-09 10:18:48 作者: rapoo

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、4return (*this);}~auto_ptr(){delete p;// 自动调用delete,所以不能绑定到动态分配的数组,是个缺陷。}ElemType *get() const _THROW0(){return (p);// 返回自己保存的指针}ElemType *operator->() const _THROW0()// 返回保存的指针{ // 还有待研究#if _ITERATOR_DEBUG_LEVEL == 2if (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 == 2if (p == 0)_DEBUG_ERROR("auto_ptr not dereferencable");#endif /* _ITERATOR_DEBUG_LEVEL == 2 */return (*get());//  为什么不直接return *p?}private:ElemType *p;// 保存的指针};

以上源码是Plauger写的,他是专门写库的。

读书人网 >编程

热点推荐