initializer_list、初始化列表、列表初始化
什么是列表初始化
使用一个花括号来初始化变量,表现形式如下:
std::vector<int>a{1,2,3,4,5};
或者
std::vector<int>a = {1,2,3,4,5};
这里用到了一个新的类型,即initializer_list,包含在标准库头文件中。
优点
- 在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、初始化列表、列表初始化的更多相关文章
- Qt中新建类构造函数的初始化参数列表
使用Qt-creator自动生成一个窗体应用程序时会自动创建一个新的类,我的程序中名为MyDialog,类的定义为: #ifndef MYDIALOG_H #define MYDIALOG_H #in ...
- 【c++】必须在类初始化列表中初始化的几种情况
转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iost ...
- C++中构造函数初始化成员列表总结
1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中 ...
- C++的初始化成员列表
class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(),b(8.8) {} //构造函数内部赋值 CExample() ...
- C++中的初始化参数列表
c++中以下几种情况的变量的初始化不可以写在构造函数里,而是要写在初始化参数列表中 1.const常量 class AA { public : const int num; public : AA() ...
- c++初始化函数列表
以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况: 二,需要初始化const修饰的类成员: 三,需要初始化引用成员数据: 原因: C++可以定义引用类型的成员变量,引用类型 ...
- c++中初始化列表的初始化变量顺序问题
例题来看:请问下面程序打印出的结果是什么? #include <iostream> #include <string> using namespace std; class b ...
- 20140316 window live write 插件 推荐代码高亮插件 构造函数只能用初始化成员列表方式的例子
1.window live write 插件:http://www.cnblogs.com/liuxianan/archive/2013/04/13/3018732.html 2.推荐代码高亮插件:W ...
- 转:C++初始化成员列表
转载至:https://blog.csdn.net/zlintokyo/article/details/6524185 C++初始化成员列表和新机制初始化表达式列表有几种用法: 1.如果类存在继承关系 ...
- 【原创】c++拷贝初始化和直接初始化的底层区别
说明:如果看不懂的童鞋,可以直接跳到最后看总结,再回头看上文内容,如有不对,请指出~ 环境:visual studio 2013(编译器优化关闭) 源代码 下面的源代码修改自http://blog.c ...
随机推荐
- 关于php ‘==’ 与 '===' 遇见的坑
两个的区别所有PHPer都知道, 今天在遍历 xmlNode时,自己写的代码就碰坑了 想遍历xmlNode为数组 得到的xmlNode为 想要把所有的simpleXmlElement对象都遍历转成数组 ...
- ubuntu14.04修改mysql默认编码
修改文件为/etc/mysql/my.cnf [client] default-character-set = utf8 (ps:client的设置没变) [mysqld] lower_case_ta ...
- 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛
题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...
- bzoj 1572: [Usaco2009 Open]工作安排Job
Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...
- 多态Poly中的向上/下转型 Upcast/Downcast
[参考资料]马克-to-win java中多态polymorphism,向上转型和动态方法调度有什么用? java中什么叫多态,动态方法调度(dynamic method dispatch)? jav ...
- canvas 转化为 img
]; var image = new Image(); image.src = c.toDataURL("image/png"); $("#qrcode canvas&q ...
- TroubleShoot:网站设置找不到术语管理
在SharePoint站点中找不到“术语管理”这个链接功能. 解决方案: Enable-SPFeature -id “73EF14B1-13A9-416b-A9B5-ECECA2B0604C” -Ur ...
- QBXT 二月五号整理
给你一列数, 询问和最大的子串. N<=10^6 // N <=10^6 #include<cstdio> #include<iostream> using nam ...
- 【Visual Studio】Windows program compatibility mode is on, turn it off……
[问题描述]Windows 10上安装 Visual Studio Ultimate 2013,出现下面错误: [解决方案]将.iso文件解压到硬盘再安装.
- react-dnd 拖拽
介绍 React DnD 是一组 React 高阶组件,可以用来帮你构建复杂的拖拽接口,同时解耦你的组件.React DnD 非常适合像 Trello 和 Storify 这样的应用,在不同地方通过拖 ...