引用計數(shù)技術(shù)及智能指針的簡單實現(xiàn)
基礎(chǔ)對象類
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:
//該類成員訪問權(quán)限全部為private餐塘,因為不想讓用戶直接使用該類
friend class SmartPtr<T>; //定義智能指針類為友元,因為智能指針類需要直接操縱輔助類
//構(gòu)造函數(shù)的參數(shù)為基礎(chǔ)對象的指針
U_Ptr(T *ptr) : p(ptr), count(1) { }
//析構(gòu)函數(shù)
~U_Ptr()
{
delete p;
}
//引用計數(shù)
int count;
//基礎(chǔ)對象指針
T *p;
};
智能指針類
template <typename T>
class SmartPtr //智能指針類
{
public:
SmartPtr(T *ptr) : rp(new U_Ptr<T>(ptr)) { } //構(gòu)造函數(shù)
SmartPtr(const SmartPtr<T> &sp) : rp(sp.rp)
{
++rp->count; //復(fù)制構(gòu)造函數(shù)
}
SmartPtr &operator=(const SmartPtr<T> &rhs) //重載賦值操作符
{
++rhs.rp->count; //首先將右操作數(shù)引用計數(shù)加1赘阀,
if (--rp->count == 0) //然后將引用計數(shù)減1,可以應(yīng)對自賦值
delete rp;
rp = rhs.rp;
return *this;
}
T &operator *() //重載*操作符
{
return *(rp->p);
}
T *operator ->() //重載->操作符
{
return rp->p;
}
~SmartPtr() //析構(gòu)函數(shù)
{
if (--rp->count == 0) //當引用計數(shù)減為0時脑奠,刪除輔助類對象指針基公,從而刪除基礎(chǔ)對象
delete rp;
else
cout << "還有" << rp->count << "個指針指向基礎(chǔ)對象" << 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++ 引用計數(shù)技術(shù)及智能指針的簡單實現(xiàn)(文章寫的太好了,轉(zhuǎn)過了以后用)