類設計前首先需要確定的是,該類所執行個體化的對象是值語義還是引用語義。值語義
一般用於非獨佔性資來源物件,
表示該對象可以像int
一樣的工作,可以任意的拷貝和重新賦值,而不會引起資源泄漏或者切割(指部分資源釋放而部分泄漏)。引用語義一般用於獨佔性資源封裝
對象
,表示該對象不允許拷貝和重新賦值。從文法的角度上來說,
以下代碼對值語 義是有效,而對引用語義是無效的
:
CMyObject a,c;
CMyObject b(a);
//值語義有效,引用語義無效
c = a; //值語義有效,引用語義無效
注意:假如以上語句有效並成功執行,但在執行代碼後
,a對象狀態發生了變化,則該對象類文法上表現為值語義,而本質上還是引用語義。如
std::autoptr
。
引用語義與
值語義應用的
基本規則如下
:
1、盡量使對象實現值語義而不是引用語義。引用語意物件不能使用在
stl
容器中。
2、
對系統
獨佔性
資源封裝的類
可以使用
引用語義。如印表機封裝類,螢幕案頭類等。
3、通過聲明而不定義拷貝建構函式和賦值操作符,顯示的定義引用語義。
4、通過引用計數技術,可以使得原本是引用語義的對象實現為值語意物件。
5、基類對象應該禁止值語義,但提供
Clone
方法,進行對象複製。
引用語義文法實現如下:
class CMyObject
{
public:
typedef CMyObjectmy_type;
...
public:
//拷貝建構函式
(
聲明而不定義,禁止值語義
)
CMyObject(const my_type& rhs);
//賦值操作符重載
(
聲明而不定義,禁止值語義
)
my_type& operator=(const my_type& rhs);
....
};
值語義文法實現如下:
class CMyObject
{
public:
typedef CMyObject
my_type;
...
public:
//拷貝建構函式
CMyObject(const my_type& rhs) {...}
//賦值操作符重載
(
聲明而不定義,禁止值語義
)
my_type& operator=(const my_type& rhs)
{
my_type aTemp(rha);
Swap(aTemp);
}
void Swap(my_type& rhs){...}
....
};
胡樂秋
2010/8/3 於長沙
http://blog.csdn.net/hlqyq