**:
控制代碼類
控制代碼類的出現是為了解決使用者使用指標時需要控制指標的載入和釋放的問題。用指標訪問物件很容易出現懸垂指標或者記憶體洩漏的問題。
為了解決這些問題,有許多方法可以使用,控制代碼類就是其中之一。控制代碼類是一種包裝類,用於儲存和管理基類的物件指標,減輕使用者使用物件的負擔。控制代碼類使用指標執行操作,虛成員由於既可以指向基型別又可以指向派生型別,所以其行為將在執行時根據控制代碼實際繫結的物件而變化。
控制代碼類的設計有兩個重要的考慮因素:
指標型控制代碼
指標型控制代碼例子
[cpp]view plain
copy
print?
class
sales_item
sales_item(const
item_base& item): p(item.clone()), use(
newsize_t
(1)) {}
sales_item(const
sales_item& item):p(item.p), use(item.use)
~sales_item()
sales_item& operator=(const
sales_item&);
const
item_base* operator->()
const
; const
item_base& operator*()
const
; private
: void
decr_use();
private
: item_base *p;
size_t
*use;
};
sales_item& sales_item::operator=(const
sales_item& rhs)
const
item_base* sales_item::operator->()
const
const
item_base& sales_item::operator*()
const
void
sales_item::decr_use()
}
這個控制代碼類中要求item_base類中有乙個
虛函式clone
,這個虛函式的用途是解決基型別物件或者派生型別物件的複製,這樣可以不用為控制代碼類針對每一種派生型別物件建立建構函式。
[cpp]view plain
copy
print?
class
item_base
};
以上**即可將item_base類的指標包裝起來。通過對handler類物件的*和->操作,即可直接訪問到所包裝的item_base型別物件。
值型控制代碼
值型控制代碼例子
[cpp]view plain
copy
print?
class
query
public
: query(const
string& s): q(
newwordquery(s)), use(
newsize_t
(1))
query(const
query &c): q(c.q), use(c.use)
query& operator= (const
query&);
~query()
seteval(const
textquery &t)
const
private
: void
decr_use();
private
: query_base *q;
size_t
*use;
};
void
query::decr_use()
} query& query::operator=(const
query& rhs)
值型控制代碼不定義*和->兩個操作符,基類物件指標完全封閉在控制代碼類中。
參考:
C 物件導向程式設計筆記(二)
c 物件導向程式設計 二 一 過載與覆蓋 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有virtu...
C 學習筆記 物件導向程式設計
1.什麼是類 物件和成員?類 乙個類包含很多的物件。比如人類就是乙個類,張 三 李四等是人類的物件,這些物件擁有人類共同的功能和資料,如身高 體重 年齡等,而具體化這些資料我們可看做是人類的成員變數。所以類是由若干個變數和相關函式組成,而物件則擁有這些變數和函式。2.如何宣告乙個類?類只有先宣告才能...
c 物件導向程式設計 筆記四
1.理解堆空間和棧空間 不同建立物件的方式。2.local object 和 static local object的生命週期 3.heap object的宣告週期 注意顯式釋放。4.new 先分配memory 再呼叫ctor complex pc void mem operator new siz...