1. 程式人生 > >構造函數和初始化列表

構造函數和初始化列表

cout pac clu 圖片 tro 運算 賦值運算符函數 src ()

區別:

  1. 對於在函數體中(構造函數)初始化,是在所有的數據成員被分配內存空間後才進行的。
  2. 列表初始化是給數據成員分配內存空間時就進行初始化,就是說分配一個數據成員只要冒號後有此數據成員的賦值表達式(此表達式必須是括號賦值表達式),那麽分配了內存空間後在進入函數體之前給數據成員賦值,就是說初始化這個數據成員此時函數體還未執行。

  在我們使用初始化列表進行初始化時,它是關於C++初始化類成員的。它們是按照聲明的順序初始化的,而不是按照出現在初始化列表中的順序。

三種類型必須通過初始化列表來初始化

  1. 常量
  2. 引用類型
  3. 沒有默認構造函數的類類型

  初始化列表和構造函數初始化(賦值)的方式對於內置類型的成員(如int等)來說,其實沒有什麽區別,其性能和結果往往一樣。對於非內置類型的成員(類類型)來說,是有區別的。

  因為編譯器總是確保所有成員對象在構造函數體執行之前初始化,所以類類型的數據成員對象,在進入構造函數體之前已經完成構造。例子中編譯的代碼將調用base::base()來初始化b(這裏調用一次base構造函數),這在控制到達賦值語句前完成。接下來有調用一個賦值運算符函數。結果是調用了兩個base函數(構造函數和賦值操作符)。

#include <iostream>
using namespace std;

class base
{
    public:
        base()    
        {
            cout<<"
empty construct"<<endl; } base(const base &b) { cout<<" copy construct"<<endl; } base& operator=(base &b) { if(&b!=this) cout<<" operator = construct"<<endl;
return *this; } }; class my_base { public: my_base(base &b) { ba=b; cout<<" my_base construct"<<endl; } base ba; }; int main() { base b; my_base mb(b); return 0; }

技術分享圖片

  把my_base類改成初始化列表形式

class my_base
{
    public:
        my_base(base &b):ba(b)
        {
            cout<<" my_base construct"<<endl;
        }
        base ba;
};

技術分享圖片

構造函數和初始化列表