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

C++11 統一初始化列表:語法統一、防止窄化、陣列初始化新特性

     編輯:C++ 入門

C++98 初始化的碎片化痛點

C++11 前,不同類型初始化語法不一致:

  • 聚合類型(結構體/陣列):T obj = {val1, val2};
  • 類類型:必須用構造函數 T obj(arg1, arg2);
  • 動態陣列:無法直接初始化,需循環賦值
  • 標準容器:只能用迭代器範圍構造

這導致模板代碼難以統一處理初始化,且隱式窄化轉換(如 double→int)隱患難察覺。

C++11 統一初始化:大括號語法無處不在

C++11 引入 std::initializer_list,統一使用 { ... } 初始化所有類型:

struct Man { string name; int age; };
class Woman { string name; int age; 
public: Woman(string n, int a): name(n), age(a) {} };

Man m1 = {"Alice", 20};      // 聚合初始化
Woman w1 = {"Bob", 25};      // 類初始化(需構造函數匹配)
Woman w2 {"Carol", 30};      // 直接列表初始化(C++11)
vector<int> v = {1, 2, 3};   // 容器初始化
int* arr = new int[3]{1,2,3};// 動態陣列初始化

防止窄化轉換:編譯期安全網

列表初始化禁止窄化轉換:

void func(int x);
func(3.14);      // C++98: 隱式截斷為 3,僅警告
// func({3.14}); // C++11: 編譯錯誤!窄化被禁止

int x = {3.14};  // 錯誤:double→int 窄化
int y = {3};     // 正常:int→int 無窄化

注意:若類有 initializer_list 構造函數,列表初始化優先匹配它,可能改變語義。

構造函數初始化列表中的成員陣列

class Widget {
    int data[4];
public:
    Widget() : data{1, 2, 3, 4} {} // 直接初始化成員陣列
};

自動類型推導陷阱


auto x = {1, 2};       // x 是 std::initializer_list<int>
auto y = {3.14};       // y 是 std::initializer_list<double>
// auto z = {1, 2.0};   // 錯誤:類型推導衝突

最佳實踐建議

  1. 優先使用列表初始化:統一語法、防窄化、支持容器/陣列
  2. 避免對重載函數傳遞列表:可能導致歧義或匹配 initializer_list 重載
  3. 模板代碼用 T{args...}:統一構造語法

統一初始化是 C++11 核心特性之一,徹底解決了初始化語法碎片化,提升了代碼安全性與可讀性。

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