1. 程式人生 > >C++ 建構函式的初始化列表

C++ 建構函式的初始化列表

在C++中,一個簡單的建構函式可以如下所示:

class X
{
  private:
    int i_;
    int j_;

  public:
    X(int i, int j)
    {
        i_ = i;
        j_ = j;
    }
};

C++也提供了另外一種初始化成員變數的寫法,即初始化列表:

class X
{
  private:
    int i_;
    int j_;

  public:
    X(int i, int j):i_(i), j_(j){}
};

第二種寫法,就是建構函式初始化列表。那麼問題來了,為什麼要使用這個方法來寫建構函式呢?有什麼好處嗎?那就要從C++的變數初始化說起。

C++變數初始化

首先,C++變數初始化有2種方法,直接初始化和複製初始化。複製初始化就是使用=號的初始化,而直接初始化就是使用()符號進行的初始化。
比如:

int age(20);  //直接初始化
int age = 20; //複製初始化

複製初始化使用 = 號,很容易讓人以為是進行了賦值操作而不是初始化操作,但是兩者並不是一回事,初始化是給變數分配記憶體並且給它賦值,而賦值就是替換當前變數的值。
也就是說:

int age = 20; //初始化
age = 30;     //賦值

第一行程式碼是初始化,第二行程式碼是賦值,雖然它們都是用了 = 號。

直接初始化比複製初始化更快,更靈活,大部分時間,看不出它們之間的區別,但在編寫類的時候,就可能會看出來它們的區別。直接初始化時,編譯器會呼叫建構函式直接賦值,而複製初始化時,編譯器會先呼叫直接建構函式建立一個臨時的物件,然後再呼叫複製建構函式進行賦值,所以直接初始化會更快。有時候,有些不支援複製的型別,就不能用複製初始化了。

因此,使用初始化列表,可以使初始化效率更高。

避免編譯時期錯誤

還有一個更重要的原因,是因為使用初始化列表,可以避免編譯時期的錯誤,因為有些成員變數,必須在初始化時賦值的。比如const 變數,還有一些沒有預設建構函式的類,在初始化時,需要顯式的傳入引數進行初始化。