第五章 構造 析構 拷貝語意學

2022-08-20 21:09:09 字數 2719 閱讀 1961

class abstract_base

protected:

//最好提供建構函式

//abstract_base(char *mumble_value=0):_mumble(mumble_value){}

char *_mumble;

};class concrete_derived:public abstract_base;

抽象類中可以有非靜態的成員變數,此時要在抽象類的建構函式中用初始化列表來初始化它

析構函式不能是(最好不是)純虛函式,因為每個派生類析構函式會被擴充套件,以靜態呼叫的方式呼叫每乙個virtual base以及上一層的destructor,缺少任何乙個base class destructor就會導致鏈結失敗,而此時如果此時是純虛函式,則不可能有析構函式來呼叫。

class testa

;class testb:public testa;};

呼叫時 testb b;在vs2012中是會出錯的。

最上面的類重新設定:

class abstract_base

protected:

abstract_base(char *mumble_value=0):_mumble(mumble_value){}

char *_mumble;

};1.無繼承情況下的物件構造

貌似和前面的章節重複了,忽略

2.繼承情況下的物件構造

①記錄在member initialization list的data members初始化操作會被放進constructor的函式本身,並以members的宣告順序為順序。

②如果有乙個member沒有出現在member initialization list之中,但他有乙個預設建構函式,則該預設建構函式被呼叫。

③如果有虛表,則要設定虛指標

④上一次的基類建構函式必須要呼叫:如果基類在member initialization list中,那麼明確的引數都應該傳遞過去;如果沒有在

member initialization list之中,那麼就呼叫它的預設建構函式。

5所有虛基類建構函式都要被呼叫,從左到右,從深到淺。

對於虛擬繼承,它在建構函式新增乙個測試引數來決定是否要呼叫虛基類的建構函式。

基類point有兩個派生虛繼承point3d,vertex,而vertex3d又繼承於point3d,vertex,最後pvertex繼承於vertex3d

那麼可以改寫:

point3d的建構函式為(point3d *this ,bool __most_derived,float x,float y,float z)只要__most_derived為真時才會呼叫point的建構函式。

vptr初始化語意學

如果基類point有兩個派生虛繼承point3d,vertex,而vertex3d又繼承於point3d,vertex,最後pvertex繼承於vertex3d。其中每個類中都要乙個虛函式virtual function size()返回該類的大小,如果在各個類的建構函式中呼叫會直接返回該類的大小;如果在類外使用,則根據具體值來決定。

pvertex pv;

point3d p3d;

point *pt=&pv;

pt->size();//返回pvertex大小

pt=&p3d;pt->size();//返回point3d的大小

但是如果在建構函式中就只能是該類的大小。

建構函式的呼叫順序:

①所有虛基類和基類的建構函式會被呼叫

②vptr被初始化,指向相關的irtual table

③member initialization list在建構函式展開並在最前面

④執行建構函式的程式設計師的**

所以說在member initialization list中呼叫該類的虛函式一般是安全的,除非該虛函式用到member initialization list中初始化的變數。

3.物件複製語意學

物件賦值(拷貝)函式是為了開啟named value return(nvr)

物件賦值操作copy assignment operator的合成條件和建構函式類似

當不要bitwise copy semantics時,類就需要合成乙個物件賦值操作:

1.當class內含乙個member object,而member object宣告有乙個copy constructor operator時

2.當class繼承乙個base class而後者存在有乙個copy constructor operator時

3.當class宣告了乙個或多個virtual functions時,

4.當class派生自乙個繼承串鏈,其中有乙個或多個virtual base classes時。此時無論基類有沒有copy operator。

4.效能比較

5.析構語意學

如果類沒有定義析構函式,那麼只有在類內袋的成員物件(或是自己的基類)擁有destructor的情況下,編譯器才會自動合成出乙個來。其他情況不會合成,比如說是指標。

它的執行順序:

①析構函式本身執行

②如果類有成員物件,則按照宣告順序相反呼叫它們虛構函式

③如果有vptr,則重新設定,指向適當的base class virtual class

④如果有上一層的非虛繼承的基類有析構函式,他們會議宣告的順序相反呼叫析構函式(在多重繼承下從右到左)。

如果有基虛類的析構函式,而當前討論的這個class是最尾端的class,那麼他們會議原來的構造順序的相反順序被呼叫。

C 物件模型 第五章 構造 解構 拷貝 語意學

c 的建構函式可能內帶大量的隱藏碼,因為編譯器會擴充每乙個建構函式,擴充程度視 class 的繼承體系而定。一般而言編譯器所做的擴充操作大約如下 所有虛基類成員建構函式必須被呼叫,從左到右,從最深到最淺 如果類中含有 vptr,那麼它們必須被設定初值,指向適當的 vtbl。如果有乙個成員物件沒有出現...

軟體構造期末複習 第五章

軟體的可維護性 錯誤修復 改善效能 度量方法。原則方法 目標 設計方法 耦合與內聚 模組之間聯絡越多,耦合度越高 應高內聚,低耦合 著重符號 單一責任原則 每個模組 類 不應因為超過乙個原因而發生改變 乙個類應只完成一種需求 一類操作 開放封閉原則 著重中著重符號 liskov替換原則 保證子類能夠...

組織行為學筆記 第五章 工作滿意

工作滿意程度是一種對行為進行有效管理的結果,是衡量組織在創造良好的人際交往氛圍取得進展的一種標尺。工作滿意表示雇員對工作的期望與工作所提出的報酬之間協調一致的程度。績效 滿意反饋環 滿意與績效之間確切的說是高績效導致工作滿意度高,然後反饋並影響未來的績效。優等工作績效帶來高報酬,如果這些高報酬被認為...