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

C++11 initializer_list:統一初始化列表完整指南

     編輯:關於C++

背景:從繁瑣到優雅

C++98 初始化容器需多次 push_back:


std::vector<int> v;
v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4);

C++11 std::initializer_list 支持列表初始化:


std::vector<int> v = {1, 2, 3, 4}; // 優雅、高效

initializer_list 原理

  • 輕量級代理對象,內部存儲指向數組的指針和長度
  • 編譯器將 {...} 構造為臨時數組,傳遞 initializer_list 引用
  • 支持 begin()、end()、size(),可範圍 for 遍歷

構造函數接收 initializer_list


#include <iostream>
#include <vector>

class MyNumber {
    std::vector<int> mVec;
public:
    MyNumber(const std::initializer_list<int>& v) {
        for (auto item : v) mVec.push_back(item);
    }
    void print() {
        for (auto item : mVec) std::cout << item << " ";
        std::cout << "\n";
    }
};

int main() {
    MyNumber m = {1, 2, 3, 4}; // 調用 initializer_list 構造函數
    m.print(); // 1 2 3 4
    return 0;
}

關鍵區別:{} vs ()


class CompareClass {
public:
    CompareClass(int, int) { std::cout << "普通構造函數\n"; }
    CompareClass(std::initializer_list<int>) { std::cout << "initializer_list 構造函數\n"; }
};

int main() {
    CompareClass foo{10, 20}; // 調用 initializer_list 構造函數
    CompareClass bar(10, 20); // 調用普通構造函數
    return 0;
}

規則: 列表初始化 {} 優先匹配 initializer_list 構造函數;括號初始化 () 正常匹配參數列表。

應用場景

  • 容器初始化:vector v = {1,2,3};
  • 函數參數:void func(std::initializer_list list); func({1,2,3});
  • 賦值操作:v = {4,5,6};(C++11 容器支持)
  • 範圍 for:for (int x : {1,2,3}) ...

注意事項

  • initializer_list 元素為 const,不可修改
  • 生命週期:綁定到臨時數組,隨全表達式結束銷毀,不可存儲引用/指針供後用
  • 隱式縮窄轉換被禁止:vector v = {1.5}; 報錯(C++11 縮窄檢查)
  • auto x = {1,2,3}; 推導為 std::initializer_list
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved