1.初始化列表函數
初始化列表即對數據成員進行初始化。以一個冒號開始,接着是一個以逗號分隔的數據成員列表,每一個"成員變量"後面跟一個放在括 號中的初始值或表達式。優化
構造函數體中的語句只能將其稱做爲賦初值,而不能稱做初始化。由於初始化只能初始化一次,而構造函數體內能夠屢次賦值。this
1.每一個成員變量在初始化列表中只能初始化一次。指針
2.引用類型,const類型,沒有默認構造函數的自定義類型成員,都必須在初始化列表中進行初始化。對象
3. 儘可能使用初始化列表初始化,由於無論你是否使用初始化列表,對於自定義類型成員變量,必定會先使 用初始化列表初始化。ci
4.變量在初始化列表中初始化的順序與初始化列表中的順序無關,是依據聲明時的順序。編譯器
2.explicit關鍵字it
因爲當一個類的構造函數只有一個參數時,對其進行賦值操做會自動類型轉換。例如class test{test(int a){_a=a;}private:int _a;};test a=20;此時會創造一個匿名對象調用構造函數對20進行初始化,而後使用拷貝構造對a進行初始化,不過編譯器會優化,直接使用構造函數初始化a,可是這樣的寫法會形成一些問題,例如可讀性很差,因此當想阻止這種寫法時,能夠用explicit修飾構造函數,將會禁止單參構造函數的隱式轉換。 編譯
3.靜態成員:靜態成員的本質就是能被全部對象共用,所以性質都是基於此的。class
1.靜態成員變量
存放在數據段中,靜態成員變量在類中聲明,在類外定義,且只能在類外定義和初始化,不能在類中初始化。不佔用類的空間,屬於全部對象共用,類訪問加::,對象訪問用」.「。
2.靜態成員函數
在類中聲明,在類外定義,一樣屬於全部對象,無this指針,由於它須要被全部對象調用,而不是某一個對象。所以靜態成員函數只能調用靜態成員變量,不能調用非靜態成員變量,非靜態成員變量都是屬於某一個對象,一樣不能訪問非靜態成員函數,由於非靜態成員函數都具備this指針,而靜態成員函數沒有this指針。
4.C++11新的初始化方法
在類中聲明變量時可對其進行初始化,例如private: int _a=2;但這並非初始化,而是一個默認值,即若是沒有初始化列表或構造函數,則會使用這個值。
5.友元:主要要少使用友元函數或者友元類,這樣會破壞封裝。
1.友元函數
在一個類中可使用friend聲明一個友元函數,那麼此函數就成爲了這個類的友元函數,這個函數能夠訪問這個類的private成員。友元函數不能用const修飾 友元函數能夠在類定義的任何地方聲明,不受類訪問限定符限制 一個函數能夠是多個類的友元函數 友元函數的調用與普通函數的調用和原理相同。
2.友元類
在一個類中可使用friend聲明一個友元類,那麼友元類的全部函數都會成爲這個類的友元函數。
注意:友元關係是單向的,不具備交換性。友元關係不能傳遞。
6.內部類
概念:若是一個類定義在另外一個類的內部,這個內部類就叫作內部類。注意此時這個內部類是一個獨立的 類,它不屬於外部類,更不能經過外部類的對象去調用內部類。外部類對內部類沒有任何優越的訪問權限。
注意:內部類就是外部類的友元類。注意友元類的定義,內部類能夠經過外部類的對象參數來訪問外部類中 的全部成員。可是外部類不是內部類的友元。
特性:
1. 內部類能夠定義在外部類的public、protected、private都是能夠的。
2. 注意內部類能夠直接訪問外部類中的static、枚舉成員,不須要外部類的對象/類名。
3. sizeof(外部類)=外部類,和內部類沒有任何關係。