1. 常成員函數的const必須出現在聲明和定義中。
2. 類的成員函數只能重載本類的其它成員函數,成員函數與類外的非成員函數、其它類的成員函數無關。
3. 類內部定義的成員函數,自動作為inline處理。
4. 在成員函數的聲明和定義處指定inline都是合法的,任選一個位置都行。但是由於inline函數必須在調用它的每個源檔案中可見,所以不在類定義中定義的inline函數,其定義通常應放在類定義的同一標頭檔中。
5. 類的聲明是一個不完全類型,不知道類的具體細節,所以不能定義該類的對象,只能定義指標、引用,用於聲明形參、傳回型別。所以類中不能定義該類的對象作為資料成員,只能是指標或引用。
6. 在成員函數內部顯式引用this通常是不必要的,但有一種情況下必須這樣做:當我們需要將一個對象作為整體引用而不是引用對象的一個成員時。最常見的情況是該函數返回對調用該函數的對象的引用。( ClassA & ClassA::doit() { return *this; } )
7. 非常成員函數中this是指向類類型的const指標,可以改變this指向的值,不可改變this儲存的地址。在常成員函數中this是指向const類類型對象的const指標,既不能改變this指向的對象,也不可改變this儲存的地址。不能從常成員函數返回指向類對象的普通引用,聲明函數的時候必須是const的引用。返回引用的好處是可以將一系列操作串起來( a.b().c().d(); )。但b有可能是常成員函數,而c不是。則在const對象上調用非常成員函數是行不通的。解決辦法是重載b,一個是const的,一個不是const的。
8. 有時希望類的資料成員在常成員函數中也可以被修改,可以把這個資料成員聲明為可變資料成員,只需要將mutable放到聲明前面。
9. 建構函式不能是const的。建構函式的工作是初始化對象,不管對象是否為const。
10. 必須在初始化列表中進行初始化的成員:a)沒有預設建構函式的類類型成員,b)const成員,c)參考型別成員。
11. 初始化列表的順序並不是成員被初始化的順序,而是定義成員的順序。
12. 可以傳形參的運算式給初始化列表中的初始化式( X(int v) : i(v), j(v*v) {} )。
13. 類通常應該定義一個預設建構函式,在預設建構函式中給成員提供的初始值應該指出該對象是空的。
14. 待用資料成員可以聲明為任何類型,常量、引用、數組、類類型等。必須在類定義體的外部定義,靜態成員不是普通成員,不能在建構函式中初始化,而是在定義時初始化。但當是static const int時,可以在類定義體中進行初始化,不過仍必須在類的定義休之外進行定義。
15. 靜態成員函數不是任何對象的組成部分,所以不能被聲明為const。靜態成員函數也不能聲明為虛函數。
16. 在類外部定義待用資料成員、靜態成員函數時,無須重複指定static保留字。
17. 如果類定義中有自訂的建構函式,則編譯器不會提供預設建構函式。但是就算有自訂的建構函式,編譯器也會提供複製建構函式。
18. 為了禁止複製,必須顯式聲明複製建構函式為private。因為如果不寫編譯器會合成一個預設的。
19. 如果類沒有定義自己的賦值操作符,編譯器會產生一個。可以使用合成複製建構函式的類通常也可以使用合成賦值操作符,如果類需要定義複製建構函式,那麼它也需要定義賦值操作符,要將這兩個操作看成一個單元,如果需要其中一個,肯定也需要另外一個。
20. 許多類並不需要顯式解構函式,解構函式通常用於釋放在建構函式或對象生命期擷取的資源。
21. 如果類需要解構函式,則它也需要賦值操作符和複製建構函式。
22. 與複製建構函式或賦值操作符不同,編譯總是會為我們合成一個解構函式,即使我們自己已經寫了一個,合成解構函式仍然運行。合成解構函式按成員在類中聲明次序的逆序銷毀每個非靜態成員。