C++11 统一列表初始化的实现

 更新时间:2026年09月07日 09:43:23   作者:库克克  
本文详细解读C++11统一列表初始化,教你用大括号{}轻松搞定变量、自定义类和STL容器的初始化,具有一定的参考价值,感兴趣的可以了解一下

在 C++11 之前,初始化一个变量或对象的方式五花八门:等号赋值、括号传参、大括号给数组赋初值……不仅繁琐,还容易让人记混。C++11 带着“大一统”的使命走来,彻底改变了这一切。

在 C++98 中,标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。比如 int array1[] = {1, 2, 3}; 或是给结构体赋值 Point p = {1, 2};。

但是到了 C++11,这种大括号 {}(初始化列表)的使用范围被极大地扩大了,使其可用于所有的内置类型和用户自定义的类型。这就是我们今天要聊的——统一列表初始化。

一、 一切皆可{}

在 C++11 中,使用初始化列表时,可添加等号(=),也可不添加。这种语法不仅适用于基础变量,连数组和 new 表达式也能完美适配。

// 基础变量初始化,可以不要等号!
int x1 = 1;
int x2{ 2 }; // C++11 新玩法

// 数组初始化,同样可以省去等号
int array1[]{ 1, 2, 3, 4, 5 };
int array2[5]{ 0 }; // 全部初始化为0

// 自定义结构体
struct Point { int _x; int _y; };
Point p{ 1, 2 };

// C++11 中列表初始化也可以适用于 new 表达式中
int* pa = new int[4]{ 0 }; 

二、 自定义类型,自动调用构造函数

对于类(Class)对象,C++11 同样支持这种写法。创建对象时也可以使用列表初始化方式调用构造函数初始化。

假设我们有一个 Date 类:

class Date {
public:
    Date(int year, int month, int day)
        : _year(year), _month(month), _day(day) {
        cout << "Date(int year, int month, int day)" << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

int main() {
    Date d1(2022, 1, 1);   // old style:传统的括号传参
    
    // C++11 支持的列表初始化,这里会调用构造函数初始化
    Date d2{ 2022, 1, 2 }; 
    Date d3 = { 2022, 1, 3 }; 
    return 0;
}

以前给对象传参必须用小括号 (),现在用大括号 {} 一样可以精准触发对应的构造函数,代码风格得到了史诗级的统一!

三、 幕后操作:std::initializer_list

为什么 C++11 的 {} 这么强大?当我们写下 auto il = { 10, 20, 30 }; 时,这个等号右边的 {} 到底是个什么东西?

答案是:它的类型是 std::initializer_list。

你可以把它理解为一个轻量级的、用来接收大括号列表的系统内置类型。它的出现,彻底盘活了 STL 容器的初始化。

四、 玩转 STL 容器:告别繁琐的 push_back

std::initializer_list 一般是作为构造函数的参数。C++11 对 STL 中的不少容器就增加了以 std::initializer_list 作为参数的构造函数,这样初始化容器对象就更方便了。同时,它也可以作为 operator= 的参数,这样就可以用大括号赋值。

在没有 C++11 之前,初始化一个 vector 往往需要先定义,再一行行地 push_back,十分痛苦。现在,一行代码搞定:

// 丝滑的容器初始化
vector<int> v = { 1, 2, 3, 4 };
list<int> lt = { 1, 2 };

// 连 Map 这种键值对容器也能轻松驾驭
// 这里 {"sort", "排序"} 会先初始化构造一个 pair 对象
map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };

// 使用大括号对容器赋值
v = { 10, 20, 30 }; 

总结

C++11 的统一列表初始化不仅仅是“少写一个等号”这么简单的语法糖。它通过扩展 {} 的使用范围,并引入底层的 std::initializer_list,彻底打通了内置类型、自定义类和 STL 容器之间的初始化壁垒,让 C++ 的代码变得更加现代、简洁和优雅。

到此这篇关于C++11 统一列表初始化的实现的文章就介绍到这了,更多相关C++11 统一列表初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中不能被重载的运算符介绍

    C++中不能被重载的运算符介绍

    其实在C/C++ 里大多数运算符都可以在C++中被重载的。C 的运算符中只有 . 和 ?:(以及 sizeof,技术上可以看作一个运算符)不可以被重载
    2013-10-10
  • C++实现softmax函数的面试经验

    C++实现softmax函数的面试经验

    这篇文章主要为大家介绍了C++实现softmax函数的面试经验,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C/C++ 函数的存储位置和占用空间详解

    C/C++ 函数的存储位置和占用空间详解

    Lambda函数的代码部分在代码段中,被捕获的变量存储在Lambda函数对象的内部,这些变量的存储位置取决于Lambda函数对象的存储位置,这篇文章主要介绍了C/C++函数的存储位置和占用空间,需要的朋友可以参考下
    2023-06-06
  • C++超详细介绍模板

    C++超详细介绍模板

    人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是 C++ 引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动
    2022-07-07
  • C++中的struct和class的区别详解

    C++中的struct和class的区别详解

    这篇文章主要介绍了C++中的struct和class的区别详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • C++将保存char、int 和double到txt文件中

    C++将保存char、int 和double到txt文件中

    这篇文章主要介绍了C++如何将保存char、int 和double到txt文件中,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++中const用于函数重载的示例代码

    C++中const用于函数重载的示例代码

    这篇文章主要介绍了C++中const用于函数重载的相关资料,需要的朋友可以参考下
    2017-09-09
  • C语言学习基础知识分享

    C语言学习基础知识分享

    这篇文章主要介绍了C语言学习基础知识分享的相关资料,需要的朋友可以参考下
    2023-01-01
  • C++实现幸运大抽奖(QT版)

    C++实现幸运大抽奖(QT版)

    这篇文章主要为大家详细介绍了C++实现幸运大抽奖,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C/C++哈希表优化LeetCode题解997找到小镇的法官

    C/C++哈希表优化LeetCode题解997找到小镇的法官

    这篇文章主要为大家介绍了C/C++哈希表优化题解997找到小镇的法官示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论