=========================================================================
个人主页点击直达:小白不是程序媛
C++系列专栏:C++干货铺
代码仓库:Gitee
=========================================================================
目录
C++11简介
列表初始化
std::initializer_list
std::initializer_list使用场景
decltype关键字
STL中的一些变化
新容器
array
forward_list
容器中的一些新方法
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了
C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞
进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于
C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中
约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,
C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更
强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个
重点去学习。
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。例如:
struct Point
{
int _x;
int _y;
};
int main()
{
int array1[] = { 1, 2, 3, 4, 5 };
int array2[5] = { 0 };
Point p = { 1, 2 };
return 0;
}
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
int main()
{
int i = 0;
int j = { 1 };
int k{ -1 };
cout << i << " " << j << " " << k;
int arr1[] = { 1,2,3,4,5 };
int arr2[5] = { 0 };
int arr3[]{ 1,2,3,4,5 };
//添加到new表达式中
int* pa = new int[4] {1, 2, 3, 4};
return 0;
}
创建对象时也可以使用列表初始化方式调用构造函数初始化
//自定义类型的列表初始化
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{ 2024,1,18 };
//初始化一个对象,拷贝构造
Date d2 = { 2024,1,19 };
return 0;
}
注:这里的列表初始化的是直接调用构造函数,而下面的赋值重载看起来和列表初始化差不多,其实两者天差地别;赋值重载是先使用右边的数据构造生成一个临时对象,在赋值重载,而初始化列表是直接调用构造函数。存在类型转化。
std::initializer_list文档介绍
功能:可以接受任意多个相同类型的参数
- std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
- std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
- 总结:我们使用初始化列表初始化STL中的容器时,就会将列表生成initializer_list;然后initializer_list作为容器构造函数的参数进行初始化。
关键字decltype将变量的类型声明为表达式指定的类型。
和typeid().name()、auto有很大的区别,typeid().name()推演出变量的类型,decltype是将变量的类型转化为字符串可以打印出来。
int main()
{
int i;
double j;
vector v1;
decltype(i * j) z = 10;
cout << typeid(z).name() << endl;
cout << z << endl;
return 0;
}
下面中圈起来的就是C++11中添加的新容器,最后的unordered_map和unordered_set不同于使用红黑树的map和set是使用hash结构实现;有关hash的内容和知识会在后面的文章中给大家介绍。
- array数组是固定大小的序列容器:它们包含特定数量的元素,这些元素以严格的线性顺序排序。
- 说白了也是一个数组,只不过和普通的数组比较其越界检查比较严格。
是一个单链表,和list的区别在于只支持单向迭代器;并且只支持头插和头删。
- 如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得比较少的。
- 比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的。
- 容器中一些还有一些关于移动构造移动和移动赋值的一些内容需要有右值引用的知识铺垫,我会在下一篇文章中完整的给大家介绍。
今天给大家分享介绍了C++中常用特性的一部分,由于篇幅问题会在下篇文章中介绍右值引用等其他问题;如果觉得文章还不错的话,可以三连支持一下,个人主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是我前进的动力!