【C++】C++11的新特性

news2024/11/25 10:28:59

文章目录

  • 1. C++11简介
  • 2. 统一的列表初始化
    • 2.1 {}统一初始化
    • 2.2 std::initializer_list
  • 3. 声明的新方式和范围for循环
    • 3.1 decltype
    • 3.2 auto&nullptr&范围for循环
  • 4. STL的变化
    • 4.1 新容器
    • 4.2 新接口

1. C++11简介

​ 在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++11增加的语法特性非常篇幅非常多,所以我们这里主要了解一下实际中比较实用的语法。

这里附上C++11的官方文档:C++11 - cppreference.com

在开始之前,这里有个有意思的小故事:

1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫C++ 07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11

2. 统一的列表初始化

2.1 {}统一初始化

在C++11中,对于所有的类型(包括自定义类型和内置类型)都提供了一种统一的初始化方式:使用大括号括起来的列表(初始化列表)

  • 在使用初始化列表的时候可以添加等号,也可以不添加等号
void Test1()
{
	//C++98支持的初始化方式
	int x1 = 1;
    //C++11支持的初始化方式
	int x2{ 2 };
	int arr1[] = { 1,2,3,4,5 };
	int arr2[5]{ 0 };
	//这种初始化方式也可以应用于new表达式中
	int* pa = new int[5] {1, 2, 3, 4, 5};
}
  • 同时,这种初始化也可以应用于自定义类型(类)中
void Test2()
{
	Date d1(2023, 1, 1);//之前的创建方式
	
	//C++11支持的列表初始化,这里会调用构造函数初始化
	Date d2{ 2023, 1, 2 };
	Date d3 = { 2023, 1, 3 };
	//同样支持new表达式
	Date* pd = new Date[3]{ {2023,1,4}, {2023,1,5}, {2023,1,6} };
}

2.2 std::initializer_list

那么列表初始化是怎么实现的呢?这就要提到initializer_list

介绍文档:cplusplus.com/reference/initializer_list/initializer_list/

initializer_list是什么类型呢?

image-20230705213425991

可以看到initializer_list是一个类模板。

事实上,initializer_list是非常高效的,因为它的内部并不负责保存初始u话列表中的元素拷贝,只是存储了列表中元素的引用

举个例子:

//不能这样使用initializer_list,因为a,b在返回时并没有被拷贝
initializer_list<int> func()
{
	int a = 1, b = 2;
	return { a, b };
}

所以我们应当把initializer_list看做保存对象的引用,并在它持有对象的生存期结束之前完成传递。

initializer_list的使用场景

  • 作为构造函数的参数,使初始化容器对象更加方便
  • 作为operator=的参数,使类支持大括号赋值

这里以我们之前实现的vector为例,做一个模拟实现,让vector也能够支持{}初始化和赋值

vector(std::initializer_list<T> l)//初始化列表初始化
{
    _start = new T[l.size()];
    _finish = _start + l.size();
    _endOfStorage = _start + l.size();
    iterator vit = _start;
    for (auto& e : l)
    {
        *vit++ = e;
    }
}
vector<T>& operator= (std::initializer_list<T> l)//初始化列表的赋值重载
{
    vector<T> tmp(l);
    swap(tmp);
    return *this;
}

3. 声明的新方式和范围for循环

C++11也提供了很多种简化的声明方式,尤其是在使用模板的时候用处很大。

3.1 decltype

关键字decltype能够将变量的类型声明为表达式的指定类型

在之前的时候,我们想知道一个变量的类型,采用的方式是typeid().name的方式,但是这种方式返回的是一个string,没有办法通过这种方式直接声明新的变量,但是使用decltype就可以。

// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
	decltype(t1 * t2) ret;
	cout << typeid(ret).name() << endl;
}
void Test5()
{
	const int x = 1;
	double y = 2.2;
	decltype(x * y) ret; // ret的类型是double
	decltype(&x) p; // p的类型是int*
	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;
	F(1, 'a');
}

3.2 auto&nullptr&范围for循环

关于这些知识,在博主之前的博客【C++】初识C++2(内联函数&auto关键字&范围for循环&nullptr)中有详细介绍,有感兴趣的小伙伴可以去看看,这里就不赘述了。

4. STL的变化

4.1 新容器

image-20230706001550520

上图中用红色方框框起来的就是C++11的新增容器,其中unordered系列容器在之前的博客中已经有过讲解【C++】哈希——unordered系列容器&哈希概念&哈希冲突,感兴趣的小伙伴可以去看一看,这里同样就不过多赘述了。

然后就是array和forword_list,实际上着两个容器不经常使用。

array主要对标的用法就是int arr1[5] = {0}<==>array<int, 5> arr2

void Test6()
{
	int arr1[5] = { 0 };
	array<int, 5> arr2 = { 0 };
}

二者的唯一区别就是array容器对数组越界的检查更为严格,但是在实际使用过程中,很少用到。

forword_list实际上就是一个单链表,只能进行单项操作,相对于list只是在每个元素上减少了一个指针的大小。

关于这两个容器,就不进行过多的介绍了,这里附上使用文档 array forword_list

4.2 新接口

如果再去仔细看看,就会发现每个容器中都增加了一些C++11 的方法,但是其实我们都很少用到,比如提供了cbegin和cend方法用于返回const迭代器等,但是实际上意义不大,因为begin和end也实现了const版本的函数重载,只是新增的接口让使用看起来更加的规范。

image-20230706002948397

除了迭代器之外,这里还增加了emplaceemplace_back接口,这些是插入函数的右值引用版本,这些接口的意义就是能够提高一点效率,具体提高效率的原因是右值引用,关于右值引用我们下一节再说。


本节完……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java并发编程面试题

一、线程、进程、程序 进程&#xff1a; 我们把运行中的程序叫做进程,每个进程都会占用内存与CPU资源,进程与进程之间互相独立. 线程&#xff1a; 线程就是进程中的一个执行单元&#xff0c;负责当前进程中程序的执行。一个进程可以包含多个线程。多线程可以提高程序的并行运…

Stable Diffusion 常用主流checkpoint模型

AbyssOrangeMix2 https://civitai.com/models/4437/abyssorangemix2-sfwsoft-nsfw dosmix https://civitai.com/models/6250/dosmix Counterfeit-V3.0 https://civitai.com/models/4468/counterfeit-v30 万象熔炉 | Anything V5/Ink QteaMix 通用Q版模型 https://civitai.c…

Spring Boot 中的监控及使用

Spring Boot 中的监控及使用 Spring Boot 是一个非常流行的 Java 应用程序开发框架&#xff0c;它提供了一种快速构建应用程序的方法。除此之外&#xff0c;Spring Boot 还提供了一系列的监控功能&#xff0c;方便开发人员对应用程序进行监控和管理。本文将讨论 Spring Boot 中…

MachineLearningWu_第1+2章_SupervisedLearningUnsupervisedLearning

x.1 笔记 常见Supervised Learning的app&#xff0c;会有input和label 线性拟合做回归&#xff0c; 分类问题如下&#xff0c;当单个输入但是多个类别信息时可以简化为单轴向&#xff0c; 当分类问题是多输入时&#xff0c;可以简化为特征空间如下&#xff0c; *无监督算法的核…

SiLM27624系列 双通道30V, 5A/5A高速低边门极驱动器介绍

在开关电源系统中&#xff0c;需要利用门极驱动器来有效地驱动功率器件&#xff0c;实现功率器件的快速开关&#xff0c;以减少开关功率损耗、提高系统效率。在 GaN 等新兴的宽带隙功率器件技术中&#xff0c;需要快速的传输延时、精准的延迟匹配、极强的驱动能力以满足系统中高…

移动隔断地板无轨道,只需将轨道安装于天花板上

移动隔断地板无轨道设计可以提供更加灵活的空间划分和布局选择。相较于传统的固定轨道系统&#xff0c;只需将轨道安装在天花板上&#xff0c;就能实现移动隔断的收放和推动。这种设计可以避免地板上的轨道对于日常活动和清洁的干扰&#xff0c;并且减少了地板安装的复杂性。 在…

HDLBits刷题笔记9:Circuits.Sequential Logic.Counters + Shift Registers

Counters Four-bit binary counter module top_module (input clk,input reset, // Synchronous active-high resetoutput reg [3:0] q);always (posedge clk) beginif(reset)q < 0;elseq < q 1;end endmoduleDecade counter 建立一个计数器&#xff0c;从0计数…

二分类结局变量Logistic回归临床模型预测—— 外部数据集验证

1. 介绍 2. 基线特征 3. 单因素多因素logistic回归分析及三线表 4. 构建临床列线图模型 5. 模型评价 6. 外部数据集验证 7. 另一种发文章的办法,分训练集和测试集,分析上述3-6节的内容 外部数据集验证,就是找一个别的数据集,可以是别家医院的,也可是数据库的,但是…

机器视觉初步12:C#入门初步(有代码示例)

文章目录 基础部分概述1. 变量&#xff1a;2. 数据类型&#xff1a;3. 运算符&#xff1a;4. 控制语句&#xff1a;5. 字符串和数组&#xff1a;6. 类型转换&#xff1a;7. 输出和输入&#xff1a;8. 变量命名&#xff1a;9. 函数&#xff1a;10. 枚举值的比较&#xff1a;11. …

红旗软件与派盘互认证成功

近年来,随着数据的不断增长和扩张,云计算、大数据、人工智能等技术已成为数字化转型的推动力。在这个背景下,红旗软件和派盘之间的互认证也成为了企业用户进行数据备份和管理的理想选择。 红旗软件是由中国科学院成立的软件公司,其主要产品有红旗Linux操作系统、红旗开发工…

今日分享简单的下划线转驼峰方法

简单的下划线转驼峰方法… #代码片段分享# function underLine2CamelCase(string){return string.replace( /_([a-z])/g, function( all, letter ) {return letter.toUpperCase();}); }

为什么空间坐标系之间的线性变换关系 = 坐标轴向量堆叠?

相机模型存在4个坐标系&#xff1a;世界坐标系、摄像机坐标系、图像物理坐标系和图像像素坐标系。 光心&#xff1a;图像的中心。 光轴&#xff1a;穿过图像的光心&#xff0c;与图像平面垂直的轴。 世界坐标系(Xw,Yw,Zw)&#xff1a;是客观三维世界的绝对坐标系&#xff0c…

【二叉排序树(也叫二叉搜索树)本质就是中序遍历是有序的二叉树】一道题讲解二叉排序树的本质,以及操作代码(通俗易懂的总结帮助理解操作)

1. 二叉排序树&#xff08;中序遍历是有序的&#xff09; 解释一下删除操作的第三点&#xff1a; 首先我们要清楚&#xff1a; 二叉排序树的特点是 中序遍历&#xff08;左根右&#xff09;是有序的 所以如果删除的根节点有左右子树 那么我们为了保证有序 就要把 根节点左子…

Arm64架构(MacBookPro M1)虚拟机安装k8s1.27.3版本记录及问题总结

目录 一、介绍二、安装前设置2.1 设置hostname2.2 关闭防火墙2.3 关闭selinux2.4 关闭swap2.5 允许 iptables 检查桥接流量2.6 安装Docker 三、安装container runtime3.1 安装containerd3.2 安装cri-docker 四、安装k8s集群4.1 配置aliyun的kubernetes yum源4.2 下载 kubelet k…

RTL8309M实现VLAN功能-驱动编进内核

部分硬件实现图 一、使内核支持802.1Q功能 1、使用内核kernel版本4.19.232 2、make menuconfig 配置内核 3、进入Networking support 4、进入Networking options 5、把这些都编进内核 6、点击保存退出 CONFIG_GARPy CONFIG_MRPy CONFIG_BRIDGE_VLAN_FILTERINGy CONFIG_VLAN…

2023年6月第4周大模型荟萃

2023年6月第4周大模型荟萃 2023.6.30版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、腾讯云首次公布大模型进展 6月19日&#xff0c;腾讯云召开行业大模型及智能应用技术峰会&#xff0c;首次公布腾讯云行业大模型研发进展&#xff0…

自定义MVC的初步实现

文章目录 前言一、 工作流程图二、简单的实现自定义MVCController层——Servlet中央控制器子控制器具体Action类 view层——JSP 三、初步实现自定义MVC简单MVC架构中的问题3.1 配置XML文件3.2 建模3.2 Servlet3.3 jsp 前言 在上一篇博客&#xff0c;我们介绍了MVC的演变过程&a…

华为、华三、锐捷、飞塔、山石的抓包命令

一、华为的抓包命令 1、基本概念 华为的抓包行为称之为镜像端口&#xff0c;也就是说将需要抓取的接口上&#xff08;称为镜像端口&#xff09;的流量复制一份到另一个接口上&#xff08;工程师进行流量观察的端口&#xff0c;称为观察端口&#xff09;&#xff0c;如下图所示…

23年hadoop单机版+hive

文章目录 说明分享环境信息安装jdkhadoop配置core-site.xml mysqlhive安装配置hive-site.xml配置hive-env初始化mysql数据库启动验证hive命令hiveserver2方式 总结 说明 工作需要研究hive功能&#xff0c;线上环境不能动&#xff0c;搭建单机版hadoophive测试环境&#xff0c;使…

pyodbc读取.mdb文件时出现[ODBC Microsoft Access Driver] 网络访问已中断。请关闭数据库.....解决方法

在使用pyodbc读取.mdb文件时出现下面的错误 : ODBC Microsoft Access Driver] 网络访问已中断。若要继续&#xff0c;请关闭数据库&#xff0c;然后再将其打开。 (-1022) (SQLDriverConnect) 网上找了很多方法&#xff0c;最后通过下面的方法解决了&#xff0c;就是安装64位的…