深度探索C++對象模型 chapter 2

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以前編譯器

相關文章
相關標籤/搜索