C++入门小馆:C++11第一弹
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的
passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let’s go!
我的博客:yuanManGan
我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 进阶数据结构 走进Linux的世界 题山采玉 领略算法真谛
C++ 11
1.C++11的发展历史
C++11是C++发行的第二个主要版本,并且对比C++98,有了重要的更新,C++03之后过了整整八年才C++11才真正问世。从此C++版本每隔3年推出一次版本。
2. 列表初始化
2.1 C++98传统的{}
struct Point
{int _x;int _y;
};
int main()
{int a1[] = { 1, 2, 3, 4, 5 };int a2[5] = { 0 };Point p = { 1, 2 };return 0;
}
在c++98
中结构体和数组可以用{}
来初始化
2.2 C++11中的{}
- c++11想统一初始化方式,所以想让
{}
初始化所以的对象,{}初始化
也叫列表初始化
。 - 内置类型支持,自定义类型也支持,自定义类型的列表初始化,等于先创建临时对象,然后进行拷贝构造,编译器优化为直接构造。
{}
初始化中可以省略=
。
简单的一个日期函数:
#include<iostream>
#include<vector>
using namespace std;
struct Point
{
int _x;
int _y;
};
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
:_year(year)
, _month(month)
, _day(day)
{
cout << "Date(int year, int month, int day)" << endl;
}
Date(const Date& d)
:_year(d._year)
, _month(d._month)
, _day(d._day)
{
cout << "Date(const Date& d)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{//C++11支持的//1.内置类型int a = {5};//2.自定义类型Date d1 = {2025, 9, 3};//这里的本质是先创造临时对象,然后d1拷贝构造构造临时对象//但编译器进行优化后就直接会用(2025, 9, 3)进行构造const Date& d2 = {2025, 9, 3};//这里d2引用的是{2025, 9, 3}创建的临时对象// 需要注意的是C++98⽀持单参数时类型转换,也可以不⽤{}Date d3 = { 2025 };Date d4 = 2025;// 可以省略掉=Point p1{ 1, 2 };int x2{ 2 };Date d6{ 2024, 7, 25 };const Date& d7{ 2024, 7, 25 };//只有{}初始化才能省略=// Date d8 2025;vector<Date> v;v.push_back(d1);v.push_back(Date(2025, 1, 1));// ⽐起有名对象和匿名对象传参,这⾥{}更有性价⽐v.push_back({ 2025, 1, 1 });return 0;
}
2.3 C++11中的std::initializer_list
-
虽然上面的初始化已经很方便了,但在容器初始化时,如果我们用多个值进行初始化时,就要写很多构造函数,很麻烦。
vector<int> v1 = {1,2,3};vector<int> v2 = {1,2,3,4,5};
-
C++11库中提出了⼀个
std::initializer_list
的类,这个类底层是开一个数组,将数据拷贝过来,然后有两个指针分别指向开头和结尾。 -
这是他的⽂档:initializer_list,
std::initializer_list
⽀持迭代器遍历。 -
容器⽀持⼀个
std::initializer_list的构造函数
,也就⽀持任意多个值构成的 {x1,x2,x3…} 进⾏初始化。STL中的容器⽀持任意多个值构成的 {x1,x2,x3…} 进⾏初始化,就是通过std::initializer_list
的构造函数⽀持的。
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
int main()
{std::initializer_list<int> mylist;mylist = { 10, 20, 30 };cout << sizeof(mylist) << endl;// 这⾥begin和end返回的值initializer_list对象中存的两个指针// 这两个指针的值跟i的地址跟接近,说明数组存在栈上int i = 0;cout << mylist.begin() << endl;cout << mylist.end() << endl;cout << &i << endl;// {}列表中可以有任意多个值// // 这两个写法语义上还是有差别的,第⼀个v1是直接构造,// 第⼆个v2是构造临时对象+临时对象拷⻉v2+优化为直接构造vector<int> v1({ 1,2,3,4,5 });vector<int> v2 = { 1,2,3,4,5 };const vector<int>& v3 = { 1,2,3,4,5 };// 这⾥是pair对象的{}初始化和map的initializer_list构造结合到⼀起⽤了map<string, string> dict = { {"sort", "排序"}, {"string", "字符串"} };// initializer_list版本的赋值⽀持v1 = { 10,20,30,40,50 };return 0;
}