引用計數技術及智能指針的簡單實現 基礎對象類 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { } int getX() const { return x; } int getY() const ...
引用計數技術及智能指針的簡單實現
基礎對象類
class Point
{
public:
Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { }
int getX() const
{
return x;
}
int getY() const
{
return y;
}
void setX(int xVal)
{
x = xVal;
}
void setY(int yVal)
{
y = yVal;
}
private:
int x, y;
};
輔助類
//模板類作為友元時要先有聲明
template <typename T>
class SmartPtr;
template <typename T>
class U_Ptr //輔助類
{
private:
//該類成員訪問許可權全部為private,因為不想讓用戶直接使用該類
friend class SmartPtr<T>; //定義智能指針類為友元,因為智能指針類需要直接操縱輔助類
//構造函數的參數為基礎對象的指針
U_Ptr(T *ptr) : p(ptr), count(1) { }
//析構函數
~U_Ptr()
{
delete p;
}
//引用計數
int count;
//基礎對象指針
T *p;
};
智能指針類
template <typename T>
class SmartPtr //智能指針類
{
public:
SmartPtr(T *ptr) : rp(new U_Ptr<T>(ptr)) { } //構造函數
SmartPtr(const SmartPtr<T> &sp) : rp(sp.rp)
{
++rp->count; //複製構造函數
}
SmartPtr &operator=(const SmartPtr<T> &rhs) //重載賦值操作符
{
++rhs.rp->count; //首先將右操作數引用計數加1,
if (--rp->count == 0) //然後將引用計數減1,可以應對自賦值
delete rp;
rp = rhs.rp;
return *this;
}
T &operator *() //重載*操作符
{
return *(rp->p);
}
T *operator ->() //重載->操作符
{
return rp->p;
}
~SmartPtr() //析構函數
{
if (--rp->count == 0) //當引用計數減為0時,刪除輔助類對象指針,從而刪除基礎對象
delete rp;
else
cout << "還有" << rp->count << "個指針指向基礎對象" << endl;
}
private:
U_Ptr<T> *rp; //輔助類對象指針
};
使用測試
int main()
{
int *i = new int(2);
{
SmartPtr<int> ptr1(i);
{
SmartPtr<int> ptr2(ptr1);
{
SmartPtr<int> ptr3 = ptr2;
cout << *ptr1 << endl;
*ptr1 = 20;
cout << *ptr2 << endl;
}
}
}
system("pause");
return 0;
}
參考:
- C++ 引用計數技術及智能指針的簡單實現(文章寫的太好了,轉過了以後用)