C C 筆記 C 物件導向

2021-06-04 12:33:13 字數 1478 閱讀 9779

1、虛函式

定義虛函式的類稱為多型類,編譯器會為多型類自動生成乙個虛函式表vtable。vtable是乙個函式指標陣列,用來描述每個類的虛函式位址。多太類同時還有乙個指向虛函式表的指標,為類的物件訪問虛函式。vtable中還應包含typeinfo的資訊,用來做rtti。派生類的vtable應該相容其基類的vtable。只有通過傳派生類引用或指標的形式才能讓基類使用派生類的虛函式。

2、類的靜態成員

靜態成員變數須在原始檔中初始化,它由整個類的的所有物件共享。靜態成員函式指標,沒有this指標,不能直接使用類的成員變數。

3、四個自動產生的函式

public inline函式:預設建構函式,預設析構函式,預設賦值函式,預設拷貝建構函式。

4、構造與析構函式。

建構函式可以帶引數,通過初始化列表進行類資料成員的初始化,類的非靜態const資料成員和引用成員只能在類的初始化列表進行初始化。派生類可以在初始化列表中呼叫積累的建構函式以對積累的資料成員進行初始化。     對帶乙個引數的建構函式的宣告處,用explict修飾,以免與型別轉換符引起歧義。析構函式和建構函式沒有返回值,析構函式還沒有引數。

類物件的初始化順序,基類的建構函式->成員物件的建構函式,成員物件的構造函式呼叫按照其定義順序進行。在多重派生的類中,建構函式是遞迴進行的。建構函式的呼叫順序與初始化成員列表的順序無關。析構函式的順序與建構函式完全相反。

非靜態區域性變數在定義是進行構造函式呼叫,在生存域的結尾出析構銷毀。

靜態區域性變數在其定義出構造,若無缺省建構函式,則自動初始化為0;在main結束後析構。

全域性變數(靜態,非靜態變數,類的靜態成員),在main之前構造,main結束後析構,預設為全0初始化。

引用型別的物件,不呼叫構造與析構。

動態建立的物件,在new時構造,delete時析構。

5、拷貝建構函式和拷貝賦值函式。

拷貝建構函式

a::a(const a& other)  //other允許操作私有成員

拷貝賦值函式

a& a::opertor=(const operator& other); //other允許操作私有成員

a.判斷是否自身

this == &other 

b.賦值,對指標從新分配記憶體並賦新值

c.返回*this

6。派生類的基本函式的實現注意

基類的建構函式,析構函式,賦值函式都不能被派生類繼承。所以在寫派生類是對這些函式應該注意:

派生類的建構函式,應該顯示的呼叫(初始化列表)基類的建構函式。

若基類是個多型類,那麼必須把基類的建構函式定義為虛函式,這樣派生類的析構函式也是虛函式(最好顯示宣告,便於閱讀理解),以免對造成記憶體洩漏。

派生類寫賦值函式的時候,不要忘記對基類的資料成員也要重新賦值,可以通過呼叫基類的賦值函式來實現。

c c 整理 c 物件導向(4)

下列對靜態資料成員的描述中,正確的是 a 靜態資料成員可以在類體中進行初始化 b 靜態資料成員不可以被類的物件呼叫 c 靜態資料成員不能收private控制符的作用 d 靜態資料成員可以直接用類名呼叫 解析 a錯誤。靜態資料成員必須在類外面初始化,以示與普通資料成員的區別 b錯誤cd正確 inclu...

c c 整理 c 物件導向(3)

優勢 1 靜態資料成員沒有進入程式的全域性命名空間,因此不存在程式中其他全域性命名衝突的可能性。2 使用靜態資料成員可以隱藏資訊。因為靜態資料成員可以是private成員,而全域性物件不能 無論是在建構函式初始化列表中初始化成員,還是在建構函式體中對它們賦值,最終結果都是相同的。不同之處在於,使用建...

c 物件導向筆記

繼承形式如下 class derived class access specifier base class當乙個類派生自基類,該基類可以被繼承為 public protected 或 private 幾種型別。繼承型別是通過上面講解的訪問修飾符 access specifier 來指定的。我們幾乎...