1. 程式人生 > >【修煉C++】基礎知識筆記-第7章 類

【修煉C++】基礎知識筆記-第7章 類

1 this 

任何對類成員的直接訪問都被看成this的隱式引用,this是一個常量指標 (class *const),不允許改變this中儲存的地址。

常量成員函式:在引數列表後面加一個const,表示this是一個指向常量的指標(const class *const this);

不能再一個常量物件上呼叫普通的成員函式,因為this是一個指向非常量的常量指標,因此無法將常量成員賦給this指標,這時在引數列表之後新增一個const可以解決問題,所以說這個const其實是將this修改為指向常量的常量指標。

2 建構函式

1)建構函式的名字和類名相同

2)建構函式沒有返回型別

3)建構函式不能被宣告為const型別。

4)建立類的const物件時,直到建構函式完成初始化,物件才能真正取得其常量屬性。

3 合成預設建構函式

預設建構函式,不接受任何引數,因此在類中可以定義預設建構函式,但是問題在於若程式定義了其他建構函式的話,那麼編譯器是否還會生成這個,還是根據編譯器而異???。

若程式沒有顯式的定義建構函式,則編譯器會合成一個預設建構函式(合成預設建構函式)。

預設建構函式的初始化類的規則為:

1)如果存在類內的初始值,用它來初始化成員(c++11新標準)

2)否則,預設初始化該成員。

4 合成預設建構函式的風險

合成預設建構函式適合那些簡單的類

1)定義在塊中的內建型別或複合型別被預設初始化的話,那麼它的值是未定義的。

2) 有時候編譯器無法為某些情況下生成預設建構函式,如類中包含其他類型別,若類中的類型別沒有預設初始化函式,則編譯器無法合成預設初始化函式。

5 =default

C++11新標準中,如果需要預設行為,那麼可以通過在引數列表後面寫上=default來要求編譯器生成建構函式。

6 某些類不能依賴於合成的版本(先記者,之後再來補充)

管理動態記憶體的類。vector string等有完備的資源管理 在類中無需擔心其構造和析構,賦值問題。

7 訪問許可權實現了封裝。

class 預設訪問許可權是private,在第一個訪問控制符之前是這樣。

struct 預設訪問許可權是public。

8 封裝

所謂封裝就是將類的實現的細節隱藏起來,讓外界無法直接使用,只能通過某些特定的方式才能訪問。

封裝的目的是增強安全性和簡化程式設計,使用者不必瞭解具體的實現細節,而只是通過外部介面以及特定的訪問許可權來使用類的成員。

優點:

1 確保使用者程式碼不會無意間破壞封裝物件的狀態。其實提供訪問方式還是可能被修改,但是可以降低風險。

2 被封裝的類的具體實現細節可以隨時改變,而無須調整使用者級別的程式碼。

9 友元函式

友元宣告只能出現在類定義的內部,雖然不受訪問控制符的限制但是最好集中定義在第一個控制符之前。

友元函式需要兩個宣告,一個在函式體中,一個在函式外,這兩個最好放在同一個標頭檔案中。

10 函式過載

函式過載包括一般的函式在其作用域內,還有就是成員函式。(之前一直以為只有類成員函式才可以,誤解了)

11 可變資料型別

即使是在const類也可以被修改,在變數的宣告中加入mutable 關鍵字。一個const成員函式可以改變一個可變成員的值(按理說不可以)。