C++類的學習,規範命名,建構函式,初始化列表等
阿新 • • 發佈:2019-01-28
1. 規範命名
在使用類(class)寫程式時有以下規範
成員變數的命名
//m代表member,同時標清成員的型別和具體名稱 int m_iAge; string m_strName;
成員函式及其引數的命名
//一般會有設定函式和讀取函式,即set和get開頭的函式,寫引數時在前面加下劃線 void setName(string _Name){m_strName = _Name;} string getName(){return m_strName;}
2. 規範程式設計
- 面向物件程式設計一般都使用多檔案的專案,標頭檔案寫類的抽象宣告,然後加一個同名的cpp檔案寫類的成員函式的定義
- 面向物件的程式設計的思想是讓我們用功能函式去修改和輸出成員變數的值,不推薦把成員變數寫成公有的,直接通過賦值操作修改成員變數的值。有這樣需求的話推薦使用結構體。
3. 建構函式相關
- 建構函式一般用來初始化資料成員
- 建構函式和類名同名,且沒有返回值,在函式名前不加返回型別,直接寫函式名和引數列表
- 建構函式允許過載,可以有多個建構函式
- 建構函式在物件例項化時被呼叫,如果有多個建構函式,只會根據引數呼叫其中一個且只調用一次
- 當用戶沒有定義建構函式時,編譯器會自動生成一個建構函式(空函式)
- 建構函式同樣可以給引數定義預設值,不過在使用預設引數時要避免和函式過載衝突
例如,有一個無參建構函式,有一個有兩個引數的有參建構函式其兩個引數都有預設值,在物件例項化時寫0個引數,那麼編譯器不知道呼叫無參建構函式還是有預設值的有參建構函式二報錯
4. 拷貝建構函式
顧名思義,拷貝建構函式就是用來拷貝物件的,下面是拷貝建構函式的自定義方式
class student { public: student(){} //普通建構函式 student(const student &stu){} //拷貝建構函式,有一個只讀的引用引數 };
那什麼時候會條用拷貝建構函式呢?
- 用另一個物件初始化或賦值一個物件時
student stu1; //呼叫普通建構函式 student stu2 = stu1; //呼叫拷貝建構函式 stu1 = stu2;
- 在一個物件作為函式引數時
5. 初始化列表
- 初始化列表就是用來初始化資料成員的,它幾個有個特點:
- 先於建構函式之前初始化資料成員,且初始化的效率較高
- 必須以“:”隔開寫在建構函式之後,多個數據成員用“,”隔開
- 以資料成員名後寫“()”,括號內寫初始化值的方式使用
程式碼示例
class student { public: student():name("Bob"),age(20) //初始化列表初始化name和age兩個資料成員 {} private: string name; int age; };
6. 解構函式
- 解構函式是用來釋放物件申請的資源的(如果物件申請了堆記憶體的話,就由解構函式來釋放這塊記憶體),在物件生命週期結束時自動呼叫。
程式碼示例
class MyClass { public: MyClass(){p = new int[10];} //建構函式(申請了堆記憶體) //解構函式 類名前加上“~”,其他特點和建構函式相同(無返回值,沒有引數,和類名同名) ~MyClass(){delete[] p;} //解構函式(釋放建構函式申請的堆記憶體), private: int* p; };
7. 其它需要注意的地方
- 類內的簡單函式定義會被當成內斂函式編譯,例如上面“成員函式及其闡述的命名”中的set函式就會被當成行內函數編譯
- 記憶體分割槽:堆區、棧區、全域性區(儲存全域性變數和靜態變數)、常量區(儲存常量和字串)、程式碼區
- 當一個類例項化為一個物件時在棧中會開闢相應的記憶體,例項化多個物件後在棧區都會開闢相應的記憶體空間,但這些物件使用的成員函式在程式碼區只有一個,是共用的。
- 物件的宣告歷程(圖片來源,慕課網)