C 類設計思考(二) 值語義與引用語義

2021-05-23 05:43:36 字數 1046 閱讀 6196

類設計前首先需要確定的是,該類所例項化的物件是值語義還是引用語義。值語義

一般用於非獨占性資源物件,

表示該物件可以像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左值引用作為引數...