目录
传统艺能😎
小编是双非本科大一菜鸟不赘述,欢迎米娜桑来指点江山哦(QQ:1319365055)
🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,打码路上一路向北,彼岸之前皆是疾苦
一个人的单打独斗不如一群人的砥砺前行
这是我和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我
___
十年磨(不出)一剑🤔
众所周知 C++ 是一个历来小心谨慎,不敢尝试冒进的 “刻板” 语言,C++ 标准委员会按常理都会一段时间对 C++ 进行更新修正。广为人知的是 C++ 上一个版本 C++98 ,本来说十年磨一剑,在 18 年会搞出 C++18 ,但是很明显标准委员会摸鱼的摸鱼,犹豫的犹豫,计划一拖再拖最后问世于 2011 年,索性得名——C++11。
相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。
相比较而言,C++11能更好地用于系统开发和库开发、语言更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多。但是由于 C++ 的保守不敢向 python 一样激进,到现在都没有一个网络库,这也是 C++ 一直以来的一大遗憾。
接下来就来看看 C++11 有哪些亮眼的语法吧
初始化列表统一化🤔
C++98 允许使用大括号 {} 对数组或者结构体元素进行统一的列表初始值设定,举个栗子:
struct Num
{
int _x;
int _y;
};
int main()
{
//数组元素初始化
int a[] = {
1, 2, 3};
int b[3] = {
1 };
//结构体元素初始化
Num n = {
1, 2 };
return 0;
}
众所周知,{} 的内容就是初始化列表,C++11 拓宽了 {} 业务范围,所有的内置类型和自义定类型都可以使用初始化列表初始化,在 {} 之后可以使用 = ,也可以不使用,但是在进行 new 表达式初始化时一定不能加 = (C++11新增语法):
struct Num
{
int _x;
int _y;
};
int main()
{
//{}对内置类型初始化
int x1 = {
1 }; //等号
int x2{
2 }; //不加等号
//{}对数组元素进行初始化
int a[]{
1, 2, 3}; //等号
int b[3]{
1}; //不加等号
//{}对结构体元素进行初始化
Num p{
1, 2 }; //不加等号
//C++11中列表初始化也可用于new表达式中(C++98无法初始化)
int* p1 = new int[3]{
0};
int* p2 = new int[3]{
1,2,3};
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(2022, 10, 07);
//C++11支持列表初始化这里调用构造函数初始化
Date d2 = {
2022, 10, 08 }; //等号
Date d3{
2022, 10, 09 }; //不加等号
return 0;
}
initializer_list🤔
initializer_list 是一个容器,是 C++11 新增的,但是他不像其他容器一样提供了花里胡哨的成员函数
提供了 begin 和 end 函数,用于迭代器遍历;以及获取容器中的元素个数的 size 函数。
下面两个是非成员的重载,只针对了 begin 和 end。
initializer_list 本质就是一个大括号括起来的列表,如果用auto关键字定义一个变量来接收一个大括号括起来的列表,然后以 t y p e i d ( 变量名 ) . n a m e ( ) \color{red} {typeid(变量名).name()} typeid(变量名).name() 的方式查看该变量的类型,此时会发现该变量的类型就是 initializer_list
int main()
{
auto num = {
1, 2, 3 };
cout << typeid(num).name()