1、一般採取三種方法
1)指標成員採取常規指標型行為。這樣的類具有指標的所有缺陷但無需特殊的複製控制。
2)類可以實現所謂的“智能指標”行為。指標所指向的對象是共用的,但類能夠防止懸垂指標。
3)類採取值型行為。指標所指向的對象是唯一的,由每個類對象獨立管理。
2、類中定義指標時,需要考慮的有:類的複製,類的賦值,類的析構,共用對象,及懸垂指標。
3、定義智能指標
一個行為類似指標但也提供其他功能的類。智能指標的一個通用形式是接受指向動態指派至的指標並負責刪除該對象。使用者指派對象,但由智能指標類刪除它。智能指標類需要實現複製控製成員來管理指向共用對象的指標。引用計數是實現智能指標的常用方法。
注意:是由建構函式設定共用對象的狀態並將使用計數置為1。
1)引入使用計數
定義智能指標的通用技術是採用一個使用計數(use count,也稱為引用計數,reference count)。智能指標類將一個計數器與類中成員指向的對象相關聯。使用計數為0時,刪除對象。
對一個對象進行賦值時,賦值操作符減少左運算元對象的使用計數的值(如果使用計數減至0,則刪除對象),並增加右運算元對象的使用計數的值。
2)實現使用計數有兩種策略。這裡引入一種:定義一個單獨的具體類用以封裝使用計數和相關指標。
樣本
class U_Ptr{friend class HasPtr;int *ip;size_t use;U_Ptr(int *p):ip(p), use(1){}~U_Ptr() {delete ip;}};class HasPtr{public:HasPtr(int *p, int i):ptr(new U_Ptr(p)), val(i) {}HasPtr(const HasPtr& orig):ptr(orig.ptr), val(orig.val){++ptr->use;}HasPtr& operator=(const HasPtr&);~HasPtr(){if (--ptr->use == 0)delete ptr;}private:U_Ptr *ptr;int val;};HasPtr& HasPtr::operator=(const HasPtr& rhs){++rhs.ptr->use;if (--ptr->use == 0)delete ptr;ptr = rhs.ptr;val = rhs.val;return *this;}
4、定義值型類
與處理智能指標不同的是,給指標成員提供值語義。具有值語義的類所定義的對象,其行為很像算術類型的對象:複製值型對象時,會得到一個不同的新副本。當發生複製時,改變的是指標所指向的值,而不是指標。
樣本
class HasPtr{public:HasPtr(const int &p, int i):ptr(new int(p)), val(i){}HasPtr(const HasPtr &orig):ptr(new int(*orig.ptr)), val(orig.val){}HasPtr& operator=(const HasPtr&);~HasPtr() {delete ptr;}private:int *ptr;int val;};HasPtr& HasPtr::operator=(const HasPtr& rhs){*ptr = *rhs.ptr; //是賦值val = rhs.val;return *this;}
參考
[1] http://blog.163.com/zhoumhan_0351/blog/static/3995422720100250413207/
[2] http://blog.163.com/zhoumhan_0351/blog/static/39954227201032845132592/
[3] http://blog.163.com/zhoumhan_0351/blog/static/399542272010318112048522/
[4] http://blog.163.com/zhoumhan_0351/blog/static/39954227201032092854732/
[5] http://blog.163.com/zhoumhan_0351/blog/static/3995422720100284731826/
[6] http://blog.163.com/zhoumhan_0351/blog/static/39954227201012465955824/