C++11----列表初始化和initializer_list

这里注意,这个与构造函数的初始化列表没有任何关系。首先我们先看C++98中列表,{}的使用场景:允许数组使用列表赋值

cpp 复制代码
int a[] = {1,2,3,4};
int b[5] = {0};

列表初始化

但是对于vector这样的自定义类型就无法这样赋值,而是需要循环遍历赋值。所以C++11就引入了列表初始化:

cpp 复制代码
int main()
{
    // 内置类型变量
    int x1 = {10};
    int x2{10};
    int x3 = 1+2;
    int x4 = {1+2};
    int x5{1+2};
    // 数组
    int a[5] {1,2,3,4,5};
    int b[]{1,2,3,4,5};
    // 动态数组,在C++98中不支持
    int* p1 = new int[5]{1,2,3,4,5};
    // 标准容器
    vector<int> v{1,2,3,4,5};
    map<int, int> m{{1,1}, {2,2,},{3,3},{4,4}};
    return 0;	
}

自定义类如何支持列表初始化

对于自定义类型:也是支持用列表进行初始化的,但是必须要有对应参数类型和个数的构造函数,因为用{}初始化,会调用对应的构造函数。

cpp 复制代码
class A
{
public:
	A(int x = 0, int y = 0): _x(x), _y(y)
	{}
private:
    int _x;
    int _y;
};
int main()
{
    A a{1,2};
    return 0;
}

我们要说一说,他是怎么支持stl中容器的初始化的,很显然,vector中只有capacity,size,还有一个指针,但是无论多长的列表都可以使用{}进行初始化。所以不满足上述红字的要求,那么C++11是如何支持的呢?这就要说到initializer_list,他是C++中的一个类

initializer_list

对象想要支持列表初始化,需给该类(模板类)添加一个带有initializer_list类型参数的构造函数即

可。注意:initializer_list是系统自定义的类模板,该类模板中主要有三个方法:begin()、end()迭代器以及获取区间中元素个数的方法size()。

我们来看一看这个类:

可以看到sizeof它,仅仅只有8个字节,但是给了它3个int啊,这是因为它的内部只有两个指针。你不能手动往 initializer_list 里添加或修改值 ,它是一个轻量的、只读的容器视图(view) 。唯一能让它包含元素的方式就是用 {} 初始化(调用构造函数)。

接下来说一说,形如vector这样的自定义类是如何支持{}初始化的

其实就是调用对应的构造函数。

构造函数类似:

cpp 复制代码
vector(initializer_list<T> lt)
    :_start(nullptr)
    ,_finish(nullptr)
    ,_endofstorage(nullptr)
{
    typename initializer_list<T>::iterator it = lt.begin();
    auto it = it.begin();
    while(it != lt.end())
    {
        push_back(*it);
        ++it;
    }
}

这种初始化是调用了一个initializer_list作为参数的构造函数来初始化:vector<int> v1 = {1,2,3,4,5};

所以,自定义类型对象可以使用{}初始化,必须要有对应参数类型和个数的构造函数,因为用{}初始化,会调用对应的构造函数。如果不是这种自定义类型,而是类似STL容器,如果要支持{}初始化,那么里面必须有支持一个initializer_list作为参数的构造函数

相关推荐
benchmark_cc33 分钟前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Zenova EdgeOS2 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是2 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing032 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)3 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..3 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert4 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
沫璃染墨4 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
海的透彻5 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat5 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle