Chapter 2 構造函數語意學
Q : 一個空類 默認產生哪些成員函數
A: 構造函數,析構函數, 拷貝構造函數,賦值運算符,取址運算符, 取址運算符 const
函數
2.1 Default Constructor 的構造操做
Q: 何時纔會合成一個default constructor ?
A: 當編譯器須要它的時候。
Q: 何時?
A: 以下四種狀況
1.帶有 default constructor 的 member class object
2.帶有 default constructor 的 base class
3.帶有 virtual function 的 class(聲明或繼承)
4.帶有 virtual Base Class" 的 class
指針
// 初始化語義 class Top{ public: int a; Top(int _a):a(_a){} }; class Left : virtual public Top{ public: Left(int _a, int _b):Top(_a), b(_b){} int b; }; class Right : virtual public Top{ public: Right(int _a, int _c):Top(_a), c(_c){} int c; }; class Bottom : public Left, public Right{ public: /*不管虛基類出如今繼承層次中任何地方,老是在構造非虛基類以前構造虛基類 與其出如今初始化位置無關 */ Bottom(int _a, int _b, int _c, int _d): Top(_a), Left(_a, _b), Right(_a, _c), d(_d){} int d; };
void foo(const left* ptr) { ptr->a = 1024; } //可能的編譯器轉變操做:其中, __vbcX表示編譯器所產生的指針,指向virtual base class Top void foo(const left* ptr) {ptr->_vbcX->a = 1024; }
2.2 Copy Constructor 的構造函數
當class不展示 bitwise copy semantices時,copy constructor產生
code
2.3 程序轉化語意學
copy constructor的應用,迫使編譯器多少對程序代碼進行轉化。尤爲當一個函數以傳值的方式傳回一個class object,
而該class有個copy constructor時。
繼承
2.4 成員的初始化隊伍
Q : 什麼狀況下,必須使用member initialization list:
A : 1. 當初始化化一個reference member
A : 2. 初始化一個const member
A : 3. 當調用一個base class的constructor,而它擁有一組參數
A : 4. 當調用一個member class的constructor,而它擁有一組參數
ci
注意:list中的項目順序是由class中的members聲明順序決定的,不是有initialization list的順序決定的
注意:initialization list的調用被放在explicit user code以前
編譯器