成員函數的聲明必須在類的內部,定義則既可以在類的內部,也可以在類的外部。
作為接口組成部分的非成員函數,它們的定義和聲明都在類的外部。
類可以允許其他類或者函數訪問它的非公有成員,方法是令其他類或函數成為它的友元。如果類想把一個函數作為它的友元,只需要增加一條以friend關鍵字開始的函數聲明語句即可。
友元聲明只能出現在類定義的內部,但是在類內出現的具體位置不限。友元不是類的成員,不受所在區域訪問控制級別的約束。一般來說,最好在類定義開始或結束前的位置集中聲明友元。
如果一個類指定了友元類,聲明形式friend class 類名,則友元類的成員函數可以訪問此類包括非公有成員在內的所有成員。
友元關系不存在傳遞性。
可變數據成員,是在變量的聲明中加入mutable關鍵字,任何成員函數,包括const成員函數,都可以修改可變數據成員的值。
含有指針數據成員的類一般不宜使用默認的拷貝和賦值操作,如果類的數據成員都是內置類型的,則直接使用類對象執行拷貝和賦值操作是可以的。
要想把類的成員函數定義成內聯函數,有幾種不同的途徑。第一種是直接把函數定義放在類的內部,第二種是把函數定義放在類的外部,并且在定義之前顯示地指定inline。
類允許包含指向它自身類型的引用或指針。
如果類的數據成員是const、引用,或者屬于某種未提供默認構造函數的類類型,我們必須通過構造函數初始值列表為這些成員提供初值,示例如下:
類名(參數列表...):i(ii),ci(ii),ri(i){}
在很多類中,初始化和賦值的區別事關底層效率問題:前者直接初始化數據成員,后者則先初始化再賦值。除了效率問題外更重要的是,一些數據成員必須被初始化。
成員的初始化順序與它們在類定義中的出現順序一致:第一個成員先被初始化,然后第二個,以此類推。構造函數初始值列表中初始值的前后位置關系不會影響實際的初始化順序。
如果一個構造函數為所有參數都提供了默認實參,則它實際上也定義了默認構造函數。
將構造函數聲明為explicit可抑制構造函數的隱式轉換。關鍵字explicit只對一個實參的構造函數有效,需要多個實參的構造函數不能用于執行隱式轉換,所以無需將這些構造函數指定為explicit。只能在類內聲明構造函數時使用explicit關鍵字,在類外部定義時不應加explicit關鍵字。
聚合類使得用戶可以直接訪問其成員,并且具有特殊的初始化語法形式。當一個類滿足如下條件時,我們說它是聚合的:
- 所有成員都是public的
- 沒有定義任何構造函數
- 沒有類內初始值
- 沒有基類也沒有虛函數
除了靜態常量成員之外,其他靜態成員不能在類的內部初始化。