智能指针

1. 智能指针重载指针取值操作符operator->和operator*?
template <class T> class auto_ptr
{
    T* ptr; //默认是private的
public:
    explicit auto_ptr(T* p = 0) : ptr(p) {}
    ~auto_ptr()                 {delete ptr;}
    T& operator*()              {return *ptr;}
    T* operator->()             {return ptr;}
    // ...
};

为什么需要重载(->和*)呢?因为当我们没有使用资源管理类对资源进行访问的情况下,假设资源类为A:
A a;,
访问a的成员可以 a.成员
A* b = New();
访问a的成员可以 b ->成员
而当我们将通过智能指针间接的去访问资源的情况下,我们将无法获取到 a和b,除非在智能指针的类中 显示定义一个 get函数,调用该函数返回 a或b,但是这样子却破坏了隐藏资源的作用,最终还得直接调用资源本身的 a和b,所以为了能智能指针可以直接调用A的成员,则通过重载操作符->和*,使得可以这样子去访问资源的成员, 假设资源A有一个成员函数isAFunction():
  • auto_ptr<char> p;  (*p).isAFunction();
  • anto_ptr<char>* p = new(); p->isAFunction();
可以通过智能指针直接访问资源的成员,这种方式实现更好的封装性。

2. 智能指针提供隐式转换函数实现访问其所管理的资源
可以在智能指针类中重载资源的构造函数来实现隐式转换。
template <class T> class auto_ptr
{
public:
     //...
    operator T() const {return *ptr}
    //...
}
当需要资源本身的时候,自动调用隐式转换函数,转换为底层资源。

3. 智能指针提供显式转换函数实现访问其所管理的资源
直接在智能指针类中定义一个get函数,函数返回原始资源

当你需要直接使用原始资源的时候,你必须有一个显示转换或者隐式转换函数,而重载->和*,只是为了可以通过智能指针去访问原始资源的成员而已。

4.对比隐式转换和显示转换那个好?
我的理解隐式转换本身可能会出现一些没必要转换的时候却转换了,可能自己都发现不了这样的问题存在,所以为了程序的可控性更强一些,我推荐显示转换,同时资源管理类本省是为了确保资源肯定释放了,虽然get函数与彻底的封装有些矛盾,但是这些矛盾与程序的健壮性比起来,还是值得的。

你可能感兴趣的:(智能指针)