1.初始化列表的实现 (1)当编译器看到{t1,t2tn}时便会生成一个initializer_listT对象(其中的T为元素的类型),它关联到一个arrayT,n。 (2)对于聚合类型,编译器会将arrayT,n内的元素逐一分
1.初始化列表的实现(1)当编译器看到{t1,t2…tn}时便会生成一个initializer_list<T>对象(其中的T为元素的类型),它关联到一个array<T,n>。 (2)对于聚合类型,编译器会将array<T,n>内的元素逐一分解并赋值给被初始化的对象。这相当于为该对象每个字段分别赋值。 (3)对于非聚合类型。如果该类存在一个接受initializer_list<T>类型的构造函数,则初始化时会将initializer_list<T>对象作为一个整体传给构造函数。如果不存在这样的构造函数,则array内的元素会被编译器分解并传给相应的能接受这些参数的构造函数(比如列表中有2个元素的,就传给带2个参数的构造函数。有3个元素的,就传给带3个参数的构造函数,依此类推……)。 【实例分析】initializer_list<T>初体验
2. initializer_list<T>模板//initializer_list<T>源码分析
(1)initializer_list是一个轻量级的容器类型,内部定义了iterator等容器必需的概念,本质上是一个迭代器! (2)对于std:: initializer_list<T>而言,它可以接收任意长度的初始化列表,但要求元素必须是同种类型(T或可转换为T)。 (3)它有3个成员函数:size()、begin()和end()。 (4)拥有一个无参构造函数,可以被直接实例化,此时将得到一个空的列表。之后可以进行赋值操作,如initializer_list<int> list; list={1,2,3,4,5}; (5)initializer_list<T>在进行复制或赋值时,它内部将保存着列表的地址保存在_M_array中,它进行的是浅拷贝,并不真正复制每个元素,因此效率很高。 【编程实验】打印初始化列表的每个元素
3.让自定义的类可以接受任意长度初始化列表(1)自定义类中重载一个可接受initializer_list<T>类型的构造函数 (2)在该构造函数中,遍历列表元素并赋值给相应的字段。 【编程实验】自定义类的初始化列表
|
2022-05-14
2021-11-29
2022-04-04
2022-06-24
2021-11-25