🎁个人主页:我们的五年
🔍系列专栏:C++课程学习
🎉欢迎大家点赞👍评论📝收藏⭐文章
C++学习笔记:
https://blog.csdn.net/djdjiejsn/category_12682189.html
前言:
C++11相对于C++98和C++03而言增加了大约140个新特性,使得它更像一种新语言。能更好的用于系统开发和库的开发,语言更加简单化,更加稳定,更加安全,功能更加强大,开发效率更高。
目录
1.C++11的介绍
1.1C++的历史:
1.2C++11:
2.统一的列表初始化
2.1{}初始化:
2.2std::initializer_list
3.声明
3.1auto
3.2decltype
3.3nullptr
4.范围for
5.新增容器
5.1array
5.2forward_list
1.C++11的介绍
1.1C++的历史:
(下面介绍来源于---文心一言)
⛳️ 起源阶段:
1979年,丹麦计算机科学家比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)发现C语言在表达能力、可维性和可展性方面的不足,开始对其进行了一系列的改进。
斯特劳斯特鲁普在贝尔实验室开始从事将C改良为带类的C(C with classes)的工作。他希望开发一个既要编程简单、正确可靠,又要运行高效、可移植的计算机程序设计语言。而以C语言为背景,以Simula思想为基础的语言,正好符合他的初衷和设想。
1983年,在C语言的基础上增加了面向对象编程的特性,设计了C++的雏形,此时已经具备了类、封装、继承等核心概念,后来正式更名为C++。
⛳️ 标准化阶段:
1989年,成立了ANSI和ISO(International Standards Organization)国际标准化组织和联合标准化委员会,开始C++的标准化工作。
1994年,制定了第一份C++草案,在通过后将STL(Standard Template Library,标准模板库)包含到C++中。STL不仅功能强大,同时非常优雅,然而,它也是非常庞大的。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。
1997年11月14日,联合标准化委员会通过了C++标准的最终草案。
1998年,C++的ANSI/ISO标准被投入使用,这通常被认为是标准C++。所有的主流C++编译器都支持这个版本的C++,包括微软的Visual C++和Borland公司的C++Builder。
⛳️持续改进阶段:
自C++98标准发布以来,C++标准已经经历了多次修订和扩展,每一次标准的更新都带来了新的特性、改进和优化,使得C++更加适应现代编程的需求和挑战。以下是一些主要的变化:
●C++98:C++语言的第一个正式标准版本,包含了许多重要的特性,如类和对象、继承、虚函数和多态、封装、抽象类、模板、异常处理、标准模板库(STL)、命名空间等。
●C++03:对C++98版本的漏洞做了部分修改。
●C++11(2011年发布):新增了右值引用,可以给容器提供移动语义;新增了模板类initializer_list,因此可将initializer_list作为参数的构造函数和赋值运算符;新增了可变参数模板(variadic template)和函数参数包(parameter pack),可以提供就地创建(emplacement)方法。
1.2C++11:
C++98是C++第一版的标准,C++03是对C++98中漏洞进行修复,C++11增加很多的新特性,和C++98/03有很大的区别了。1998年C++委员会成立以来,就制定了一个五年计划,打算每五年进行一次新标准的发布。但是从03年到11年之间隔了8年,是因为委员会觉得在五年之内完不成新标准的发布,所以就一直拖,到2011年才发布。但是这次标准的发布,还是很有意义的,所以要着重学习。
2.统一的列表初始化
这个新特性就是,所有的元素,都可以用列表进行初始化{}。int char 都能用列表初始化。
2.1{}初始化:
原来的数组初始化等,用={}进行初始化,比如int a1[2]={1,2};这样的初始化方式。在C++11中,可以直接这样初始化。
一切都可以用列表初始化,并且可以省略=。
#include <iostream>
struct init
{int _x;int _y;
};class Date {
public:Date(int year,int month,int day):_year(year),_month(month),_day(day){}~Date(){}
private:int _year;int _month;int _day;
};int main()
{int a{ 0 };int a[3] = { 1,2,3 };//数组初始化,省略=int b[3]{4,5,6};//结构体{}初始化init c{ 1,2 };//类初始化Date d1(2025, 01, 01);Date d2{ 2025,02,02 };Date d3={ 2025,02,02 };return 0;
}
2.2std::initializer_list
类进行初始化的时候,只能和构造函数的参数相匹配,不能多传,少传。但是容器初始化的时候可以有很多个值。
initializer_list可以让容器可以多参数进行构造,一个?两个?三个?
类的变量为两个指针,大小一直为8字节。
initalizer_list让传统容器可以支持initializer_list类型的构造。
//vector<int> a{ 0,1,2,3,4,5,6,7 };
栈,堆有自己独特的性质,不能用initializer_list初始化,也就是没有实现initializer_list参数的构造函数。
3.声明
3.1auto
auto能自动进行类型推导,用auto用于变量的声明 ,编译器会自动的推导类型。
用途:
1.简化复杂类型变量的声明。
2.和范围for相结合。
3.在lambda表达式中捕捉变量。
4.在decltype中进行类型推导。
3.2decltype
auto只能推导出类型decltype还能进行变量的运算,进行一系列的操作。
int a = 1;double b = 1.8;decltype(a * b) z;decltype(&z) w;cout << typeid(z).name() << endl;cout << typeid(w).name() << endl;
3.3nullptr
在C++中,NULL被定义为字面的0,在类型匹配的时候,会匹配到整形去。不会匹配到指针这个类型,所以C++就引入了nullptr。
nullptr会匹配到int*。
NULL会匹配到int。
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <queue>using namespace std;void func(int n)
{cout << "void func(int n)" << endl;
}void func(int* n)
{cout << "void func(int* n)" << endl;
}int main()
{func(NULL);return 0;
}
4.范围for
范围for是利用迭代器。
5.新增容器
5.1array
C++11中增加了array,unordered_map,unordered_multimap,unordered_set,unordered_multiset,forward_list等。
array,是一个固定序列的容器,其大小在编译器的时候就固定了,比传统的数组效率更高,能更好的检查越界情况。
普通数组对只读的越界检查不出来,但是array能检查出来。
int a[5] = { 0,1,2,3,4 };cout << a[8] << endl;array<int, 5> b{ 0,10,20,30,40 };//报错//cout << b[5] << endl;
5.2forward_list
单向链表,节省空间
forward_list | 节省空间,不支持尾插尾删 |
list | 双向链表 |