[C++] C++11新增构造:列表初始化和std::initializer_list

C++官方文档:https://cppreference.cn/w/

1. 列表初始化

C++98中,可以用{}初始化数组和结构体:

cpp 复制代码
//初始化
//初始化
struct Date
{
    int _year;
    int _month;
    int _day;
};

int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    Date d = {2026, 9, 10};
    return 0;
}

C++11新增了列表初始化的方式:

  • 一切对象皆可用{}初始化
  • 可以省略=(但不建议)

编译器也在构造方面进行了优化:构造 + 拷贝构造 = 直接构造

cpp 复制代码
//C++11列表初始化
struct Date
{
    int _year;
    int _month;
    int _day;
};

int main()
{
    int x = {1};
    int y{2}; //省略=
    Date d1 = {2026, 9, 10}; //构造 + 拷贝构造 = 直接构造
    vector<Date> v;
    v.push_back({2026, 9, 11});

    return 0;
}

2. std::innitializer_list

文档:std::innitializer_list

C++11还支持std::initializer_list类:auto il = { 10, 20, 30 };

  • 本质是在底层开一个数组,并拷贝数据
  • 内部有开始和结束两个指针
  • 支持迭代器遍历
  • STL容器支持任意多个值进行初始化

(本质相同,和数组一样都是开空间存储)

cpp 复制代码
//C++11的std::initializer_list
int main()
{
    vector<int> v{1, 2, 3, 4, 5};
    unordered_map<string> hashmap = {{"字符串", "string"}, {"整型", "int"}};
    //内层pair为列表初始化,外层为std::initializer_list
    return 0;
}

3. 两者区别

列表初始化的参数固定具体个数由类型决定;std::initializer_list的参数个数不限。

相关推荐
Funlang24 分钟前
龙芯上的 Fun:从跑起来到机器码
开发语言·龙芯
总要学点什么30 分钟前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
旖旎夜光1 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu1 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
普通人62 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂2 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
SomeOtherTime2 小时前
Rust集合(AI回答)
开发语言·后端·rust
曦樂~2 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
郝学胜-神的一滴3 小时前
LangChain Skill 实现(渐进披露 On-Demand Skill,LangChain 官方 Deep Agent Skill 模式)
开发语言·python·langchain·numpy
俊俊几年的3 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c