【修煉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成員函式可以改變一個可變成員的值(按理說不可以)。