1. 使用模板类
  2. 重载 -> 操作符
  3. 重载 * 操作符
template<typename T>
class MyAutoPtr{
public:
    MyAutoPtr(T * t){
        ptr = t;
    }
    ~MyAutoPtr(){
        if(ptr != NULL){
            delete ptr;
            ptr = NULL;
        }
    }
    T* operator->(){    // 相当于 ptr-> , 所以返回 ptr 指针即可,将所有操作转发给真正的指针变量
        return ptr;
    }
    T& operator*(){     // 相当于 (*ptr) ,所以返回 ptr 指向的对象引用即可
        return *ptr;
    }
private:
    T* ptr;
};
class A{
public:
    A(int a){
        cout << "A(int)..." << endl;
        this->a = a;
    }
    ~A(){
        cout << "~A()..." << endl;
    }
    void printA(){
        cout << "a = " << a << endl;
    }
private:
    int a;
};
int main( )
{ 
    MyAutoPtr<A> p(new A(10));
    p->printA();        // ptr->printA()
    (*p).printA();      // (*ptr).printA()
    
    MyAutoPtr<int> ip(new int(100));
    cout << *ip << endl;
    return 0;
}

输出:

A(int)...
a = 10
a = 10
100
~A()...