物件複製語意(C )

2021-07-12 01:08:43 字數 1563 閱讀 2766

設計乙個class,並以乙個類物件指定給另乙個類物件時,有三種選擇

+ 1.什麼都不做,實施預設行為

+ 2.提供乙個explicit copy assignment operator

+ 3.顯示拒絕把乙個類物件指定給另乙個

如果要實現第三點,不准將乙個class object指定給另外乙個類物件,那麼只要將copy assignment operator宣告為private,並且不提供定義即可。

class pointy

如果預設的memberwise copy行為已經滿足我們的需求,我們就不必去重寫拷貝賦值操作符,反而這樣,程式反倒執行得更慢

乙個類對於預設的拷貝賦值符,下面這些情況是不會表現出bitwise copy語意

+ 1.當class 內含乙個成員物件,而其類有乙個拷貝賦值符

+ 2.乙個類的基類有乙個拷貝賦值操作符

+ 3.乙個類宣告任何的虛函式

+ 4.類繼承自乙個虛基類(不論這個基類有沒有拷貝操作符)

point a,b;

...a = b;

說明:由於bitwise copy完成,把point b拷貝到point a,其間並沒有拷貝賦值操作符被呼叫,從語意上或效率上考慮,這些都是我們所需要的。

假如現在要匯入乙個拷貝賦值操作符,說明該操作符在繼承下的行為:

inline point & point::operator=( const point &p)

現在派生乙個point3d 類

class point3d : vitual public point 

如果沒有point3d定義乙個拷貝賦值操作符,編譯器就必須合成乙個,合成得到的東西可能看起來是這樣的:

// c++ 偽**

inline point3d & point3d::operator = (point3d * const

this, const point3d &p)

拷貝賦值操作符有乙個非正交性情況,它缺乏乙個member assignment list(和成員初始化列表的東西),因此下列寫法是錯誤的:

//c++ 偽**

inline point3d & point3d:: operator = (const point3d &p3d):point( p3d ),z(p3d._z)

{}

如果類沒有定義析構函式,那麼只有在類內含的成員物件(或是類的基類)擁有析構函式的情況下,編譯器才會自動合成乙個,否則,析構被視為不需要,也不需要合成,例如下面的point,預設情況下並沒有被編譯器合成出乙個析構函式-甚至雖然它擁有乙個虛函式

class point

;// 類似的道理如果把兩個point物件合成乙個line 類:

class line;

line也不會擁有乙個被合成出來的析構函式,因為point並沒有析構函式

析構函式呼叫順序

深度探索C 物件模型 語意學

有三種情況,會以乙個object的內容作為另乙個class object的初值 cpp class x x x x xx x 情況1,賦值物件 extern void foo x x void bar x foo bar default memberwise initalization 如果clas...

深入c 物件之data語意學

一 class x class y public virtual x class z public virtual x class a public y,public z 1.sizeof x 1,雖然x為空類,但是編譯器會為其分配乙個位元組,用來區分x所建立物件。例如 x t1 x t2 如果沒有...

c 複製物件

對於物件轉殖的所設計到知識點 對值型別字段只是簡單的拷貝乙個副本到目標物件,改變目標物件中值型別欄位的值不會反映到原始物件中,因為拷貝的是副本 對引用型字段則是指拷貝他的乙個引用到目標物件。改變目標物件中引用型別欄位的值它將反映到原始物件中,因為拷貝的是指向堆是上的乙個位址 原始物件中對應字段相同 ...