【C++11】initializer_list详解!

一、什么是initializer_list?

nitializer_list 是一种C++11新的类型特性,它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器,通常用于构造函数函数参数中,以允许传递一个初始化元素列表。

  • initializer_list也是一种模板类型。
    template< class T >class initializer_list;

  • 该类模板中主要有三个方法:begin()end()迭代器以及获取区间中元素个数的方法size()

  • 保存的只是指向一个常量,无法对其修改

  • C++11允许构造函数和其他函数把初始化列表当做参数。

二、为什么要使用initializer_list?

1.需要传入不确定个数的实参时

#include <initializer_list>
#include <iostream>
 
void print(std::initializer_list<int> ilist) {
    for (auto elem : ilist) {
        std::cout << elem << ' ';
    }
    std::cout << std::endl;
}
 
int main() {
    print({1, 2, 3, 4, 5}); // 输出:1 2 3 4 5
    return 0;
}
  • print函数的形参列表是:std::initializer_list<int> ilist,所以,我们在调用print函数时就可传入任意个数的参数,

2.快速对STL容器进行初始化

对于STL的container的初始化就方便多了,比如以前初始化一个vector需要这样:

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

在c++11添加了initializer_list后,我们可以这样初始化

std::vector v = { 1, 2, 3, 4 };

3.多个对象的列表初始化

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "这是日期类" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	//C++11容器都实现了带有initializer_list类型参数的构造函数
	vector<Date> vd = { { 2022, 1, 17 }, Date{ 2022, 1, 17 }, { 2022, 1, 17 } };
	return 0;
}

三、优缺点

优点

(1).统一初始化语法:使用 initializer_list,可以为不同的容器和对象类型提供统一的初始化语法。
(2).简化构造函数重载:可以用一个接受 initializer_list 参数的构造函数替代多个重载版本。
(3).支持范围 for 循环:initializer_list 支持基于范围的 for 循环,使得遍历元素变得非常简洁。

缺点

(1).只读:initializer_list 中的元素是只读的,你不能修改其中的元素。
(2).性能考虑:使用 initializer_list 可能涉及数组的复制,尤其是在传递给构造函数或函数时。
(3).生命周期:initializer_list 引用的元素数组的生命周期与 initializer_list 对象的生命周期相同,这可能导致悬垂引用的风险。

相关推荐

  1. C++11】initializer_list详解

    2024-06-19 07:32:04       8 阅读
  2. C++ 多态详解14

    2024-06-19 07:32:04       48 阅读
  3. <span style='color:red;'>10</span> <span style='color:red;'>C</span>++<span style='color:red;'>11</span>

    10 C++11

    2024-06-19 07:32:04      5 阅读
  4. C#语言入门】16. 委托详解

    2024-06-19 07:32:04       19 阅读
  5. <span style='color:red;'>C</span>++<span style='color:red;'>11</span>

    C++11

    2024-06-19 07:32:04      18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 07:32:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 07:32:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 07:32:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 07:32:04       18 阅读

热门阅读

  1. QT day4

    QT day4

    2024-06-19 07:32:04      6 阅读
  2. 百度网盘提速攻略:解决限速问题的实用方法

    2024-06-19 07:32:04       9 阅读
  3. vue项目cnpm i 报错

    2024-06-19 07:32:04       5 阅读
  4. 基于springboot的美食推荐商城源码数据库

    2024-06-19 07:32:04       6 阅读
  5. 【HarmonyOS NEXT 】鸿蒙generateBarcode (码图生成)

    2024-06-19 07:32:04       6 阅读
  6. 界面美观的测试报告

    2024-06-19 07:32:04       5 阅读
  7. JWT详解、JWTUtil工具类的构建方法

    2024-06-19 07:32:04       8 阅读
  8. bashrc和profile区别

    2024-06-19 07:32:04       5 阅读
  9. 下载工程resources目录下的模板excel文件

    2024-06-19 07:32:04       7 阅读
  10. 架构设计 - Nginx Proxy Cache 缓存配置

    2024-06-19 07:32:04       5 阅读
  11. 认识QML

    2024-06-19 07:32:04       5 阅读
  12. CSS 修改鼠标图标样式

    2024-06-19 07:32:04       5 阅读