- 使用模板类
- 重载
->
操作符 - 重载
*
操作符
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()...