什么是列表初始化

使用一个花括号来初始化变量,表现形式如下:

  1. std::vector<int>a{1,2,3,4,5};

或者

  1. std::vector<int>a = {1,2,3,4,5};

这里用到了一个新的类型,即initializer_list,包含在标准库头文件中。

优点

  1. 在C++11以前,如果要初始化一个vector,需要这样做
  1. std::vector<int>a;
  2. a.push_back(1);
  3. a.push_back(2);
  4. a.push_back(3);
  5. a.push_back(4);
  6. a.push_back(5);

很明显,使用列表初始化使得代码量少了很多,也更加的简洁优雅。

2. 这种方式不仅仅可以用在STL中,也可以用于一般的内置类型。

  1. int c{3};
  2. int c = {3};

乍一看,这样做没什么优点,并没有变得更简洁,甚至还要多写两个花括号。但在CppCoreGuideline中,非常推荐这种写法。原因是有一个类型检查

  1. int c = 3.3; //这里会进行默认类型转换
  2. int b = {3.3}; //这里编译器会给出警告(也有可能是错误)

理论上,这样的代码更加健壮。

自定义类型使用initializer_list

c++11也提供了方法,让用户可以在自定义类型(一般指类)中使用初始化列表。

  1. #include <iostream>
  2. #include <vector>
  3. class Num
  4. {
  5. private:
  6. std::vector<int> vv;
  7. public:
  8. Num(const std::initializer_list<int> &v)
  9. {
  10. for (auto a : v)
  11. {
  12. vv.push_back(a);
  13. }
  14. }
  15. void PrintNum(void)
  16. {
  17. for (auto v : vv)
  18. {
  19. std::cout << v << " ";
  20. }
  21. std::cout << std::endl;
  22. }
  23. };
  24. int main(int argc, char **argv)
  25. {
  26. Num n{1, 2, 3, 4};
  27. n.PrintNum();
  28. return 0;
  29. }

实现方法,简单来说,就是加入initializer_list类型来实现构造函数,在新建对象时,就可以使用列表初始化的方式了。

一个特殊用法

在使用python的时候,有时候会这样操作

  1. for i in [1,2,3]:
  2. print(i)

看起来很简洁优雅,c++其实也有这种操作

  1. #include <iostream>
  2. int main(int argc, char **argv)
  3. {
  4. for(auto n : {1,2,3,4,5,6})
  5. {
  6. std::cout<<n<<std::endl;
  7. }
  8. }

initializer_list、初始化列表、列表初始化的更多相关文章

  1. Qt中新建类构造函数的初始化参数列表

    使用Qt-creator自动生成一个窗体应用程序时会自动创建一个新的类,我的程序中名为MyDialog,类的定义为: #ifndef MYDIALOG_H #define MYDIALOG_H #in ...

  2. 【c++】必须在类初始化列表中初始化的几种情况

    转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iost ...

  3. C++中构造函数初始化成员列表总结

    1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中 ...

  4. C++的初始化成员列表

    class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(),b(8.8) {} //构造函数内部赋值 CExample() ...

  5. C++中的初始化参数列表

    c++中以下几种情况的变量的初始化不可以写在构造函数里,而是要写在初始化参数列表中 1.const常量 class AA { public : const int num; public : AA() ...

  6. c++初始化函数列表

    以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况: 二,需要初始化const修饰的类成员: 三,需要初始化引用成员数据: 原因: C++可以定义引用类型的成员变量,引用类型 ...

  7. c++中初始化列表的初始化变量顺序问题

    例题来看:请问下面程序打印出的结果是什么? #include <iostream> #include <string> using namespace std; class b ...

  8. 20140316 window live write 插件 推荐代码高亮插件 构造函数只能用初始化成员列表方式的例子

    1.window live write 插件:http://www.cnblogs.com/liuxianan/archive/2013/04/13/3018732.html 2.推荐代码高亮插件:W ...

  9. 转:C++初始化成员列表

    转载至:https://blog.csdn.net/zlintokyo/article/details/6524185 C++初始化成员列表和新机制初始化表达式列表有几种用法: 1.如果类存在继承关系 ...

  10. 【原创】c++拷贝初始化和直接初始化的底层区别

    说明:如果看不懂的童鞋,可以直接跳到最后看总结,再回头看上文内容,如有不对,请指出~ 环境:visual studio 2013(编译器优化关闭) 源代码 下面的源代码修改自http://blog.c ...

随机推荐

  1. PHP经典面试题目汇总(上篇)

    1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起 ...

  2. Python web 周总结

    按顺序查询 order_by()    order_by(- ) 下拉框默认显示 <select name="canteen_type_id" id="" ...

  3. 【bzoj3566】[SHOI2014]概率充电器 树形概率dp

    题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的 ...

  4. Codeforces 898E Squares and not squares

    题目大意 给定 $n$($n$ 是偶数,$2\le n\le 2\times 10^{5}$)个非负整数 $a_1,\dots, a_n$($a_i\le 10^9$). 要求将其中 $n/2$ 个数 ...

  5. [暑假集训--数位dp]hdu3709 Balanced Number

    A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. ...

  6. SharePoint 2013 App 开发—App开发概述

    基于安全性的考虑,SharePoint App 不能像其它两种方式一样,直接使用安全性更高的服务端代码的API.Javascript 扮演极为重要的角色,在SharePoint App中与ShareP ...

  7. win10 升级导致找不到SQL Server配置管理器

    1.背景 SQL Server配置管理器可用来管理与SQL Server相关联的服务.配置SQL Server使用的网络协议以及从SQL Server客户端计算机管理网络连接配置.但是win10从17 ...

  8. SqlHelper类-全面

    // ===============================================================================// Microsoft Data ...

  9. Oracle For 循环添加数据

    自己亲自使用的,绝对OK --添加数据declare i number; --用for实现 begin for i in 0 .. 500 loop insert into cust(custsn,t ...

  10. Unsafe in Java

    http://www.cnblogs.com/xrq730/p/4976007.html http://www.importnew.com/14511.html http://blog.csdn.ne ...