【C++课程学习】:C++11(C++发展,列表初始化,声明auto,typeid,decltype)

devtools/2025/1/15 15:06:15/

🎁个人主页:我们的五年

🔍系列专栏: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双向链表


http://www.ppmy.cn/devtools/150707.html

相关文章

Spring Boot 应用开发入门

一、Spring Boot简介 Spring Boot 是一个基于 Spring 框架的开源 Java 基础框架&#xff0c;它简化了基于 Spring 的应用开发。Spring Boot 提供了一种快速、便捷的方式来创建独立、生产级的基于 Spring 框架的应用程序。它通过提供一系列的“启动器”依赖&#xff0c;帮助开发…

ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器

有时候因为服务器不能实现github或者gitlab的自动部署服务&#xff0c;所以就需要使用脚本来实现自动部署&#xff0c;可以省时省力&#xff0c;一劳永逸。这里就使用ssh2-sftp-client和ssh2来实现&#xff0c;即便是需要sudo权限&#xff0c;也是可以的。 1.先将本地打包后的…

Cherno C++学习笔记 P52 处理多返回值

在这篇文章当中&#xff0c;我们解决一下如何用C的函数处理多返回值的问题。 在有些情况下&#xff0c;我们希望我们的函数可以返回多个返回值&#xff0c;比如返回两个string或者是一个int加上一个string。如果我们用的是python之类的语言的话&#xff0c;那这个事情其实是很…

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成&#xff0c;CVPR2024 code&#xff1a;CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper&#xff1a;2311.10329 背景 研究问题&#xff1a;这篇文…

Kylin: `GLIBC_2.34‘ not found

需要查看服务器GLIBC版本 strings /lib64/libc.so.6 |grep GLIBC_如果没有&#xff0c;有两种办法&#xff0c;一种是libc.so.6降级&#xff0c;但是这样很容易将服务器搞崩溃 所以可以尝试下载对应版本 glibc 打包编译&#xff0c;重新建立软连&#xff0c;下列是RPM资源可以…

win10安装anaconda环境与opencv

1 下载anaconda 从清华镜像源下载&#xff0c;下载地址Anaconda3-2024.06-1-Windows-x86_64.exe 。 2 安装anaconda 双击下载的应用&#xff0c;点击下一步&#xff0c;选择一个安装路径&#xff0c;如下所示&#xff0c;然后再点选"Add Anaconda3 to my Path"&am…

空指针:HttpSession异常,SpringBoot集成WebSocket

异常可能性&#xff1a; 404 &#xff1a; 请检查拦截器是否将请求拦截WebSocket握手期间HttpSession为空 HttpSession为空 方法一 &#xff1a; 网上参考大量的文档&#xff0c;有说跟前端请求域名有关系的。 反正对我来说&#xff0c;没啥用无法连接。 需使用 localhost&a…

蓝牙开发 基础知识

文章目录 前言一、蓝牙广播1&#xff1a;广播信道2&#xff1a;广播的数据结构3&#xff1a;用户广播结构4&#xff1a;广播包的内容&#xff1a;广播事件: 二、蓝牙状态切换蓝牙从机&#xff08;Peripheral&#xff09;的状态蓝牙主机&#xff08;Central&#xff09;的状态 三…