首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 初始化列表詳解(一):概念、執行階段與性能優勢

     編輯:關於C++

什麼是初始化列表

建構函數除名稱、參數列表、函數體外,可在冒號後跟初始化列表:

struct Foo {
    string name;
    int id;
    Foo(string s, int i) : name(s), id(i) {}  // 初始化列表
};

建構函數的兩個執行階段

  1. 初始化階段:所有類類型成員在進入函數體前完成初始化。若未出現在列表中,則呼叫預設建構函數。
  2. 計算階段:執行函數體內的賦值語句。

為何使用初始化列表

對內建型別(int、指標等)差異不大;但對類類型,列表初始化可直接呼叫拷貝/移動建構函數,避免「預設建構 + 賦值」兩步操作,提升效率。

struct Test1 {
    Test1() { cout << "Default\n"; }
    Test1(const Test1&) { cout << "Copy\n"; }
    Test1& operator=(const Test1&) { cout << "Assign\n"; return *this; }
};
struct Test2 {
    Test1 t;
    Test2(Test1& x) : t(x) {}  // 列表:直接 Copy
    // Test2(Test1& x) { t = x; } // 函數體:Default + Assign
};

列表版僅輸出 Copy,函數體版輸出 Default + Assign。

必須放在初始化列表的情況

  1. const 成員:只能初始化,不能賦值。
  2. 參考成員:必須綁定初始化,不可重新綁定。
  3. 無預設建構函數的類成員:函數體賦值會先嘗試預設建構,導致編譯錯誤。

成員初始化順序

按成員在類中**宣告順序**初始化,與列表中順序無關。最好保持列表順序與宣告順序一致,避免未定義行為。

struct Foo {
    int i, j;
    Foo(int x) : i(x), j(i) {}      // OK:i 先初始化
    Foo(int x) : j(x), i(j) {}      // 錯誤:i 用未初始化的 j 初始化
};

總結

初始化列表是 C++ 高效、正確建構物件的關鍵機制。原則:能用列表就用列表,順序跟隨宣告順序,const/參考/無預設建構成員強制使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved