類設計前首先需要確定的是,該類所例項化的物件是值語義還是引用語義。值語義
一般用於非獨占性資源物件,
表示該物件可以像int
一樣的工作,可以任意的拷貝和重新賦值,而不會引起資源洩漏或者切割(指部分資源釋放而部分洩漏)。引用語義一般用於獨占性資源封裝
物件,表示該物件不允許拷貝和重新賦值。從語法的角度上來說,
以下**對值語 義是有效的,而對引用語義是無效的:
cmyobject a,c;
cmyobject b(a);
//值語義有效,引用語義無效
c = a; //值語義有效,引用語義無效
注意:假如以上語句有效並成功執行,但在執行**後
,a物件狀態發生了變化,則該物件類語法上表現為值語義,而本質上還是引用語義。如
std::autoptr。
引用語義與
值語義應用的
基本規則如下:
1、盡量使物件實現值語義而不是引用語義。引用語義物件不能使用在
stl容器中。 2、
對系統獨占性資源封裝的類
可以使用
引用語義。如印表機封裝類,螢幕桌面類等。
3、通過宣告而不定義拷貝建構函式和賦值操作符,顯示的定義引用語義。
4、通過引用計數技術,可以使得原本是引用語義的物件實現為值語義物件。
5、基類物件應該禁止值語義,但提供
clone
方法,進行物件複製。
引用語義語法實現如下:
class cmyobject ;
值語義語法實現如下:
class cmyobject
//賦值操作符過載
(宣告而不定義,禁止值語義)
my_type& operator=(const my_type& rhs)
void swap(my_type& rhs)
....
};
胡樂秋
2010/8/3 於長沙
go 型別的值語義和引用語義
go語言重大部分型別都是基於值語義,包括 1.基本型別 byte,int,bool,float32,float64,string等 2.復合型別 陣列array,結構體struct,指標pointer等 重點來了,c c 中,陣列傳遞是引用語義,但在go中,陣列和基本型別沒啥區別,都是值語義,也就是...
C 之值語義與物件語義
iostream擴充套件 include 是不是太重量級了?class date void writeto std ostream os const private int year month day std ostream operator std ostream os,const date d...
C 移動語義和右值引用
移動語義類似於在計算機中移動檔案的情形 實際檔案還留在原來的地方,而只修改記錄。例如有乙個函式,它返回乙個vector物件 要實現移動語義,需要讓編譯器知道什麼時候需要複製,什麼時候不需要。這就是右值引用發揮作用的地方。可定義兩個建構函式,其中乙個是常規複製建構函式,它使用const左值引用作為引數...