什么是列表初始化

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

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

或者

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

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

优点

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

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

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

int c{3};
int c = {3};

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

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

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

自定义类型使用initializer_list

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

#include <iostream>
#include <vector> class Num
{
private:
std::vector<int> vv;
public: Num(const std::initializer_list<int> &v)
{
for (auto a : v)
{
vv.push_back(a);
}
} void PrintNum(void)
{
for (auto v : vv)
{
std::cout << v << " ";
}
std::cout << std::endl;
}
}; int main(int argc, char **argv)
{
Num n{1, 2, 3, 4};
n.PrintNum(); return 0;
}

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

一个特殊用法

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

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

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

#include <iostream>

int main(int argc, char **argv)
{
for(auto n : {1,2,3,4,5,6})
{
std::cout<<n<<std::endl;
} }

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. js 抓取页面数据

    数据抓取 主要思路和原理 在根节点document中监听所有需要抓取的事件 在元素事件传递中,捕获阶段获取事件信息,进行埋点 通过getBoundingClientRect() 方法可获取元素的大小和 ...

  2. Hibernate框架简述(转)

    转自:http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用 ...

  3. 设计模式(十六)迭代器模式 Iterator

    什么时候需要用到迭代器模式? 有许多中方法,可以把对象堆起来放进一个集合(可以是数组.堆栈.列表.哈希表,等等). 每一种类型的集合,都有各自适用的时机.但是某个时间段,客户端可能希望去遍历这个集合. ...

  4. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

  5. OpenCV For Java环境搭建与功能演示

    http://blog.csdn.net/jia20003/article/details/68944486

  6. ECMA-262 Extractions

    For the purpose of this article, ECMA-262 refers to ECMAScript® 2017 Language Specification. ECMAScr ...

  7. BZOJ-1036 [ZJOI2008]树的统计

    树链剖分模版题. #include <cstdlib> #include <cstdio> #include <cstring> #include <algo ...

  8. 【BZOJ入门3189】 猜数字(数学,搜索)

    Description 味味最近在玩猜数字的游戏,现在她也希望你来玩一下这个游戏.猜数字游戏的规则是这样的,告诉你一个正整数 n(2<=n<=11),然后味味心中会想一个 n 个数字组成的 ...

  9. 标准C程序设计七---61

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  10. Git开发必知必会

    比如说你现在准备写一个自己的视频资源网站,在创业初期,你的项目暂时还是测试阶段,没有用户的时候,你可能只有一个人在开发,你每天都以写的内容和时间作为文件名的命名,这样其实是可以满足你对版本控制的基本需 ...