目录
1.初始化列表的实现2. initializer_list1.初始化列表的实现
(1)当编译器看到{t1,t2…tn}时便会生成一个initializer_list
(2)对于聚合类型,编译器会将array
(3)对于非聚合类型。如果该类存在一个接受initializer_list
【实例分析】initializer_list
#include#include #include
2. initializer_list模板
//initializer_list
#includetemplate class initializer_list { public: typedef T value_type; typedef const T& reference; //注意说明该对象永远为const,不能被外部修改! typedef const T& const_reference; typedef size_t size_type; typedef const T* iterator; //永远为const类型 typedef const T* const_iterator; private: iterator _M_array; //用于存放用{}初始化列表中的元素 size_type _M_len; //元素的个数 //编译器可以调用private的构造函数!!! //构造函数,在调用之前,编译会先在外部准备好一个array,同时把array的地址传入模板 //并保存在_M_array中 constexpr initializer_list(const_iterator __a, size_type __l) :_M_array(__a),_M_len(__l){}; //注意构造函数被放到private中! constexpr initializer_list() : _M_array(0), _M_len(0){} // empty list,无参构造函数 //size()函数,用于获取元素的个数 constexpr size_type size() const noexcept {return _M_len;} //获取第一个元素 constexpr const_iterator begin() const noexcept {return _M_array;} //最后一个元素的下一个位置 constexpr const_iterator end() const noexcept { return begin() + _M_len; } };
(1)initializer_list是一个轻量级的容器类型,内部定义了iterator等容器必需的概念,本质上是一个迭代器!
(2)对于std:: initializer_list
(3)它有3个成员函数:size()、begin()和end()。
(4)拥有一个无参构造函数,可以被直接实例化,此时将得到一个空的列表。之后可以进行赋值操作,如initializer_list
(5)initializer_list
【编程实验】打印初始化列表的每个元素
#include//打印初始化列表的每个元素 void print(std::initializer_list vals) { //遍历列表中的每个元素 for(auto p = vals.begin(); p!=vals.end(); ++p){ std::cout << *p << " "; } std::cout << std::endl; } //std::initializer_list 的浅拷贝。以下的返回值应改为std //以下的返回值应改为std::vector 类型,而不是std::initializer_list 类型。 std::initializer_list func(void) int a = 1; int b = 2; return {a, b}; //编译器看到{a, b}时,会做好一个array 对象(其生命 //期直至func结束),然后再产生一个initializer_list //临时对象,由于initializer_list 采用的是浅拷贝,当 //函数返回后array 会被释放,所以无法获取到列表中的元素! int main() print({1,2,3,4,5,6,7,8,9,10}); print(func()); return 0; /*测试结果: e:\Study\C++11\7>g++ -std=c++11 test1.cpp e:\Study\C++11\7>a.exe 1 2 3 4 5 6 7 8 9 10 */
3.让自定义的类可以接受任意长度初始化列表
(1)自定义类中重载一个可接受initializer_list
(2)在该构造函数中,遍历列表元素并赋值给相应的字段。
【编程实验】自定义类的初始化列表
#include#include
到此这篇关于C++11中跳转initializer_list实现分析的文章就介绍到这了,更多相关C++11 initializer_list内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?