64,654
社区成员
发帖
与我相关
我的任务
分享
模板类 auto_ptr 给出了一种智能指针形式。
这里我想知道关于其辅助类 auto_ptr_ref 的作用?
template<class _Ty>
struct auto_ptr_ref
{ // proxy reference for auto_ptr copying
explicit auto_ptr_ref(_Ty *_Right)
: _Ref(_Right)
{ // construct from generic pointer to auto_ptr ptr
}
_Ty *_Ref; // generic pointer to auto_ptr ptr
};
【VS2008】
1、下面是我从《C++ STL》中文版 第四章 摘录的部分解释(供参考):
考虑那些成员模板函数时,事情变得复杂了,在对象所存储的指针可以互换或者赋值的前提下,它们
有意地允许在这些对象间进行互换或者赋值。它们同样也有意地允许将这样的对象作为参数传递给函
数调用以及作为函数的返回值使用。
这就是添加嵌套类auto_ptr_ref以及那个有趣的构造函数和模板类型转换操作符来处理该嵌套类对象
的原因。
【注意这里说的是‘嵌套类’,可是VS2008里的实现却不是这样,为什么?】
这种方法的理论基础依赖于C++标准中一个相当深奥的话题【指的是什么?】
#include <iostream>
using namespace std;
class Auto_ptr
{
public:
Auto_ptr(int *p):point(p)
{
}
Auto_ptr(const Auto_ptr &obj):point(obj.release())
{
}
~Auto_ptr()
{
delete point;
}
int* release() const
{
int *p=point;
point=NULL;
return p;
}
int& operator* ()
{
return *point;
}
private:
mutable int *point;
};
int main()
{
Auto_ptr a=Auto_ptr(new int(3));
Auto_ptr b(new int(4));
cout<<*a<<*b<<endl;
return 0;
}
http://www.javaeye.com/topic/746062
1,auto_ptr类保证同一个指针,同一时刻只允许一个auto_ptr保持它,所以拷贝与赋值都会让实参的auto_ptr失去控制权,所以不能使用const auto_ptr & 这样的形参.
2,不能使用const形参,则必须使用auto_ptr &,但是当传入的实参是右值时,即一个临时auto_ptr对象时,又必须使用const auto_ptr &.
3,所以,我们定义auto_ptr &的形参的拷贝构造函数来接受左值auto_ptr实参,定义一个中间类auto_ptr_ref来解决传入auto_ptr对象为右值的情况,增加一个构造函数形参为auto_ptr_ref.
4,当我们auto_ptr<int*> left=auto_ptr<int*>(new int(2));时,=右边就是一个临时对象,此时不能调用形参为auto_ptr &的构造函数来构造left,所以只能调用auto_ptr_ref形参的构造函数,所以要给auto_ptr增加一个类型转化operator auto_ptr_ref().
5,在auto_ptr_ref里,右值auto_ptr必须让自己的指针为NULL,并且将指针的所有权给auto_ptr_ref对象管理,转化完成后,右值auto_ptr已经是个废物,随便它自生自灭.
6,此时,我们得到了一个auto_ptr_ref临时对象,里边装有new int(2)这个指针,由于我们的auto_ptr有接受auto_ptr_ref类型的构造函数,所以成功匹配,将auto_ptr_ref里的指针赋值给=左边的auto_ptr对象,而我们只要保证auto_ptr_ref的拷贝函数只是复制指针,auto_ptr_ref的析构函数什么都不做就可以了.
2、这里是从《The C++ Programming Language》14.4.2 中摘录
auto_ptr_ref的用途就是为普通auto_ptr实现破坏性复制语义,这也使const auto_ptr不可能赋值。
【不懂;不使用它,也可以让const 不能赋值啊,这可以参阅More Effective c++ 中的实现。此外在
该书中,同样将auto_ptr_ref作为嵌套类】
3、VS2008中提供的源码
这里的实现有这样一个方法,_Right是传值,在方法内将其数据改变,
【好像没用啊?】
auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
{ // construct by assuming pointer from _Right auto_ptr_ref
_Ty *_Ptr = _Right._Ref;
_Right._Ref = 0; // release old 【注意】
_Myptr = _Ptr; // reset this
}
类似的还有
auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
{ // assign compatible _Right._Ref (assume pointer)
_Ty *_Ptr = _Right._Ref;
_Right._Ref = 0; // release old【注意】
reset(_Ptr); // set new
return (*this);
}