C++11一切皆可列表初始化
变量列表初始化
自定义类型列表初始化
cpp
struct Point
{
int _x;
int _y;
};
int main()
{
Point p{ 1, 2 };
return 0;
}
数组列表初始化
日期类列表初始化
cpp
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{
cout << "Date(int year, int month, int day)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main() {
Date d1{ 2003,11,28 };
Date d1={ 2003,11,28 };//列表初始化可以省略赋值符号
}
new多个对象列表初始化
new 多个日期类对象
c++11之前只能对这样new多个日期类:
11之后可以这样new多个日期:
vector,list,Date 列表初始化区别
Date只能初始化三个参数,因为Date构造函数只有三个参数:年,月,日:
多一个参数会报错,少一个参数也会报错:
但是vector,list初始化列表 参数不固定,根据需要自己决定参数个数。
难道vector写了很多个构造函数,每个构造函数都有不同的参数个数吗?
在vector的构造函数,c++11有一个构造函数叫:initializer_list
initializer_list的用法如下:
auto会自动转化为initializer_list。
原理: initializer_list不存储数据,只是用两个指针指向数据开头和结尾
initializer_list可以像容器一样去遍历:
同时, initializer_list还支持范围for:
用我之前自己模拟实现的vector来写区间调用:
vector · 孙鹏宇/孙鹏宇的第一个仓库 - 码云 - 开源中国 (gitee.com):
明显不可以调用。
我们写一个initializer_list构造函数就可以用了:
赋值也可以调用initializer_list构造,不过是深拷贝:
map也可以用 initializer_list
decltype
typeid()可以推导类型,但是它只是把类型以字符串的形式打印出来给你看一下,只能看不能用:
t的值肯定是double,但是假设我们不知道是什么类型,现在想在vector里用t的类型,auto用不了,因为auto不能作为参数类型。
typeid()也不行,因为它只能看,不能拿来用。
这个时候就只能用decltype了。