Learning C++ No.28 【C++11语法实战】

news2024/11/22 16:12:09

引言:

北京时间:2023/6/5/9:25,今天8点45分起床,一种怎么都睡不够的感觉,特别是周末,但是如果按照我以前的睡觉时间来看,妥妥的是多睡了好久好久,并且昨天也睡了一天,哈哈哈,睡觉这方面,真的睡能比我强,昨天是实训课,课程内容主要就是做一些C语言二级的题目,虽然还没开始上什么实训课的时候,我就知道这个课肯定是划水,但是没想到可以这么划,So,接下来4天都每课,我们一定要实现日更,这个星期坚持更文6篇,将周榜名次给抢回来,步入正题,今天就让我们一起学习一下有关C++11的内容吧!具体内容也就是C++11的入门基础知识,当然重点在于有关右值引用相关知识,并且当我们将C++11学习的差不多,我们就需要暂停C++的学习,转而投向系统编程的知识啦!

在这里插入图片描述

什么是C++11

我刚开始的时候,对什么是C++11也存在一定的疑问,只知道它是2011年发布的一个C++新版本,但我的理解是C++11不还是C++吗?和以前学习的有什么不一样呢?语法不还是一样的吗?为什么需要去学习这个呢?那此时我只能用一个经典名言来形容一下我的感受了,在日落黄昏之时,你远看,你以为你看到的是山,但是它可能是山,也可能不是山,具体它到底是山不是山,只有你来到近处,才能判断,到底该山是山还是川,突临近处,你近看此山,觉,此山非彼山,此山似金山,又似银山,摇头曰,荆棘之山也,山矗眼前,安知此山像从前, 欲从此山登仙境,必先上山后下山,充分表明,对一个事物想要知道其是真是假,我们首先要做的就是实践,只有当你实践完之后,你才有下结论的依据,最终这个事物到底是怎样的,你就必须充分的去了解它,方可答心之所惑,在继C++98之后,学习C++11也是如此,没有学习C++11之前,谁都不知道它和C++98有什么不同,只有当你了解过或者学习完了,你才能猜想或者断定,C++11是什么,所以目前在我看来,我认为C++11就是在C++98的基础上增添了更多的语法,更多的容器,更多的优化,具体详情,如下文所示:当然感兴趣的同学,可以直接看C++官方文档,C++官方文档

支持使用{}初始化

在C++11增添的语法中,其中就包括了使用大括号 "{}" 进行各种类型变量的初始化,此时有的同学就会好奇,在C语言中不就已经支持使用大括号初始化变量了吗?更何况C++11,这个不是原来就有的语法吗?如下就是C语言中使用大括号初始化变量的经典代码:
在这里插入图片描述

此时我们如图可以发现,在C语言中,大括号初始化变量的语法一直都是存在的,并且不仅可以直接初始化数组,而且可以初始化结构体,那么C++11中的大括号初始化变量和此时有什么区别呢? 原来是C++11扩大了大括号初始化变量的使用范围,让大括号不仅可以初始化数组和结构体,还可以初始化所有的内置类型和各种容器的自定义类型 ,如下图所示:
在这里插入图片描述
并且C++11在这个扩大初始化变量范围的基础上,此时它还允许你在初始化过程中将赋值符号给省略,如下图所示:
在这里插入图片描述
以上就是所有有关C++11中使用大括号去初始化内置类型和自定义类型的表面使用原理和使用语法,具体是如何实现,还得看我来给你们细细讲解,如下:首先我们要明白两个概念,在C++11看来,每一个大括号 "{}" 中的内容,也就是我们用逗号隔开的数据,我们称之为 初始值列表 ,而我们在使用具体的初始值列表去初始化对应的变量时,我们利用的是 列表初始化 的特性,也就是说,C++11之所以可以使用大括号对各种类型变量进行初始化的原因就是因为我们可以使用对应初始值列表中的数据,根据列表初始化的特性,最终成功完成初始化,明白了这两个概念,此时想要彻底搞懂C++11中的大括号初始化就差临门一脚了,那就是 什么叫做列表初始化特性呢? 当然显而易见,列表初始化首先一定是使用初始值列表去初始化对应的对象,但,不同类型的对象拥有不同的列表初始化方法,其中最常见的两种列表初始化方法是:直接初始化和拷贝初始化 ,那么具体什么时候使用直接初始化,什么时候使用拷贝初始化呢?这个问题,当然是由具体的对象类型说了算,具体如下:

此时我们将被大括号初始化的对象分为:1.聚合类型 2.非聚合类型,从聚合类型来看,有结构体、数组等,从非聚合类型来看,有整形、浮点型等,总的来看,可以分为是否由多个成员变量组成,如果是由多个成员变量组成,那么就是聚合类型,否则为非聚合类型,并且对于聚合类型,编译器在进行初始化时,会根据对应初始值列表中的数据个数和具体的参数个数来匹配相应对象的初始化值,并存储在相应的内存单元中,对于非聚合类型,编译器则会自动调用和该对象类型匹配的构造函数进行初始化,上述就是有关聚合类型和非聚合类型初始化时的一些方法,具体还需要通过各种场景来分析,这里不过多介绍

具体初始化场景

通过调用构造函数进行初始化:
在这里插入图片描述

上述日期类可以很好的调用构造函数进行初始化,那是因为日期类属于非聚合类型,因为日期类中的成员变量独立存在,那么像vector和list这些聚合类型具体如何使用大括号进行初始化呢?

vector<int> v1 = { 1,2,3,4,5 };
list<int> lt1 = { 1,2,3,4,5 };

上述两行代码中,大括号中的数据(初始值列表)具体是如何初始化v1和lt1对象的呢?首先如下图所示:
在这里插入图片描述

我们发现,此时对于大括号中的数据(初始值列表而言)它的类型是一个 initializer_list< int > 的类型,那么这个类型是个什么类型呢?如下图所示:C++网站上的使用说明

在这里插入图片描述

所以很简单,此时我们就知道了,begin()和end()代表的就是初始值列表中首个数据的地址和最后一个数据的后一个位置的地址,具体初始化过程,如下图所示:

在这里插入图片描述
当然同理,list使用大括号进行初始化是一样的,本质都是vector、list和各种容器中具有initializer_list这个类为参数的构造函数而已,如下,我们再来看看,使用大括号初始化更加经典的代码,如下图所示:
在这里插入图片描述
如上图所示,大括号中包含大括号的写法,可以看出,需要进行两层的初始化,先初始化内部的大括号,后初始化外部大括号,并且同理,对日期类进行初始化时,我们是直接去调用它的构造函数进行初始化,对vector初始化时,同理是去调用vector类中的initializer_list参数的构造函数进行初始化,所以同理如下图所示:对于map的初始化也是一样
在这里插入图片描述
本质还是分为两层,一层是去调用map类中pair参数的构造函数初始化,另一层是调用map中的initializer_list参数的构造函数,具体为什么会直接去调用对应的构造函数,就是因为我们此时使用的是大括号进行初始化,所以initializer_list类的产生本质就是为了让各种容器的初始化变得更加方便
在这里插入图片描述

C++11中的声明

无论是之前有关C语言,还是C++98的学习,我们都知道声明相关的知识,我们可以对变量进行声明,可以对函数进行声明,可以对类进行声明,反正声明的本质就是对具体的类型先进行一次介绍,告诉编译器具体声明类型的信息及名称,并且学习声明,重点就是区分声明和定义的区别,声明只是告诉编译器类型的信息及名称,而定义则需要是为对应的类型分配内存并提供具体的代码实现,具体C++11中新增的声明如下:

1.auto
在C++11中auto的作用效果是实现自动推导类型,也就是根据变量的初始化表达式推导该变量的类型,这样可以简化代码书写,并有助于提高代码的可读性,具体如下图所示:两句代码本质没有任何区别,这也就是使用auto自动推导类型的好处
在这里插入图片描述

2.decltype
本质decltype的作用效果和auto是一致的,都是自动推导数据类型,那么为什么有了auto之后,还要有decltype呢?原因就是,auto只能做到推导类型,但是我们并不能获取到该类型,也就是我们只能看到对应的类型,而不能继续使用该类型去定义变量,所以在C++11中为了解决这个问题,就增加了decltype的关键字,让我们不仅可以自动推导类型,而且还可以直接使用推导出来的类型去定义变量,如下图所示:
在这里插入图片描述

当然decltype最大的使用场景不在于直接定义对象,而是作为容器的模板参数使用,如下图所示:
在这里插入图片描述
如上图所示,也就是当我们要求vector存储的类型和x*y表达式返回值类型一致时,此时使用decltype是一个非常好的选择,所以总的来看,decltype的作用就是推导对应的类型,让这个类型可以直接定义对象或者作为模板参数去实例化类

3.nullptr
谈到nullptr,这就涉及到了一个C++的bug,具体原因不知道为什么,反正当时在实现C++语法的时候,莫名其妙的就将NULL给识别成了0,而不是空指针,具体如下源码所示:
在这里插入图片描述

所以在C++11中为了解决空指针的这个bug,就增加了nullptr这个补丁,让C++语法拥有自己空指针,否则如果每次想要使用空指针都需要进行强制类型转换,那么非常的麻烦,当然在C++11出现之前,你想要使用空指针,你就必须进行强制类型转换,所以现在看来,我们还是比较幸福的

范围for

在之前的学习中,我们都知道,范围for的本质就是迭代器,因为只有实现了迭代器,范围for才能被使用,没有迭代器就没有范围for,并且在此之前学习的各种容器中,无论是对于迭代器的认识,还是范围for的认识我们都是非常的熟练的,此时只需要明白一点就行,就是范围for是C++11新增的一个功能,所以这里我们进行稍微的描述,具体如下代码所示:
在这里插入图片描述

智能指针

文章来到这里,我们就介绍一下什么是智能指针,当然此时我们只是简单介绍一下,具体有关智能指针的知识,在后面的博客中,我们会详细分析和讲解,此时只要简单明白,什么是智能指针及其优点就行,首先指针指针是C++11新增的一个功能,它是一种常用的内存管理工具,它可以自动化地分配、释放和共享对象内存空间,其次使用智能指针可以避免常见的内存管理错误,如,空指针,野指针,内存泄露等,从而提高代码的安全性、可读性、可维护性,具体使用方法: 智能指针通过对指针对象进行封装,使其行为类似于一个常规指针,也就是类似迭代器的使用方法,对STL中各种容器的遍历方式进行封装,从而达到一个抽象的普遍概念,提供了访问和遍历容器元素的统一接口,使得可以对不同类型的容器实现相同的操作(对比理解)

STL库的改变

在这里插入图片描述

如上图所示,我们可以看出,在C++11中新增了6个,但是本质上是4个,因为unordered_set和unordered_multiset本质没什么区别,其中序列式容器有array和forward_list,但是这两个容器增加的较为鸡肋,因为STL中已经有了vector和list两个非常实用的容器了,导致新增的array和forward_list变得非常的不常用,但是新增它们也是有一定道理的,例如,array可以很好的替代静态数组,可以更好的检查越界,拥有高效的随机访问,没有额外的动态内存管理开销等,且注意:forward_list是一个单链表,与list有一定的区别,其中最大的区别就是forward_list只有一个指针,所以更加的节省空间,并且在插入数据和删除数据的时候,更加方便,但是无论是array还是forward_list,它们的优点都还并不足以撼动vector和list的地位,所以在STL中看来,它们是比较鸡肋的,但C++11中新增的unordered_set和unordered_map是非常的有用的,因为哈希在日常生活中肯定是被普遍使用的,所以这两个容器在STL中扮演着重要角色

右值引用

上述知识只是对C++11新增的语法做一个强调,本质在之前学习C++语法的过程中,我们都是大致了解过的,所以只是进行一个简单的声明,也就是类似介绍说,这些语法已经心有所属了,它们所属的是C++11,而不是C++98,本质并没有什么太大的学习成本,当然在此处和右值引用比起来,可以等于是不怎么重要,在C++11的新增中不怎么亮眼,但是当我们要进行右值引用的学习时,这块的知识就相当的仇重要啦!因为右值引用在编码过程中是非常实用的,由于这块的知识较为复杂,并且由于我的时间安排不怎么合适,所以我们留到下篇博客再见,这里先简单介绍一下

总结:C++11也不过如此,So,So!希望右值引用也是如此,不会给我太大的负担,虽然对于右值引用我已经有了一定的认识,但是后序更加深入的知识,我并没有了解,但,还是那句话,一遍搞不定,我们就两遍,啦啦啦啦!

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

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

相关文章

C#,码海拾贝(32)——计算“实对称三对角阵的全部特征值与特征向量的”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

第⑩讲:Ceph集群CephFS文件存储核心概念及部署使用

文章目录 1.CephFS文件存储核心概念1.1.CephFS文件存储简介1.2.CephFS文件存储架构1.3.CephFS文件系统的应用场景与特性 2.在Ceph集群中部署MDS组件3.在Ceph集群中创建一个CephFS文件存储系统3.1.为CephFS文件存储系统创建Pool资源池3.2.创建CephFS文件系统3.3.再次观察Ceph集群…

chatgpt赋能python:从后到前查找Python字符串

从后到前查找Python字符串 Python是一种流行的编程语言&#xff0c;广泛用于Web开发、数据科学和算法设计等领域。其中&#xff0c;字符串是Python编程中的重要概念之一&#xff0c;它不仅可以表示文本&#xff0c;还可以进行各种处理。本篇文章将介绍Python字符串从后到前的查…

chatgpt赋能python:Python如何运行最方便

Python 如何运行最方便 Python 是一种高级编程语言&#xff0c;被广泛使用于各类领域。由于其简单易学&#xff0c;可读性高&#xff0c;适用于不同平台的特性&#xff0c;Python 已成为计算领域、Web 开发、数据分析等领域的首选语言之一。如果您正在学习 Python 或需要对其进…

【SQL】Oracle数据库安装并实现远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

RTL8380MI/RTL8382MI管理型交换机系统软件操作指南六:RSTP/快速生成树协议

对RSTP/快速生成树协议进行详细的描述&#xff0c;主要包括以下内容&#xff1a;STP概述、RSTP介绍、全局配置、端口配置、RSTP信息、端口信息. 1.1 STP概述 STP&#xff08;Spanning Tree Protocol&#xff09;是生成树协议的英文缩写。STP协议中定义了根桥&#xff08;RootB…

报表生成器FastReport .Net用户指南:显示数据列、HTML标签

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

『 前端三剑客 』:HTML常用标签

HTML中常用标签 HTML中常用标签一 . 认识HTML标签二 . HTML标签介绍三 . 案例应用 一 . 认识HTML标签 在HTML中标签是以成对的结构出现的,在HTML当中代码是通过标签来组织的 , 下面通过见得的Hello World的展现来显示歘HTML 标签的结构 <html><head></head>…

mac使用anaconda安装人声分离开源工具spleeter

0. 以下为一步步自己摸索的成功安装过程 1. 安装 spleeter 注&#xff1a;anaconda 的虚拟环境 conda install spleeter太慢 pip install spleeter下载卡住 (tensorflow) Robin-macbook-pro:~ robin$ pip install spleeter Collecting spleeterWARNING: Retrying (Retry(t…

伺服电机的刚性和惯量如何理解

要说刚性&#xff0c;先说刚度。 刚度是指材料或结构在受力时抵抗弹性变形的能力&#xff0c;是材料或结构弹性变形难易程度的表征。 材料的刚度通常用弹性模量E来衡量。在宏观弹性范围内&#xff0c;刚度是零件荷载与位移成正比的比例系数&#xff0c;即引起单位位移所需的力…

OpenAI 领导层建议成立人工智能国际监管组织

人工智能的发展非常迅速&#xff0c;其潜在风险也变得越来越明显&#xff0c;为此&#xff0c;OpenAI的领导层认为&#xff0c;世界需要一个类似于核能监管机构的国际人工智能监管机构--要尽快建立&#xff0c;但也不能操之过急。 在该公司的一篇博文中(https://openai.com/blo…

javaScript蓝桥杯----图⽚⽔印⽣成

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 很多⽹站都会通过给图⽚添加⽔印的形式来标记图⽚来源&#xff0c;维护版权。前端⽣成⽔印通常是通过canvas 实现&#xff0c;但实际上我们也可以直接利⽤ CSS 来实现图⽚⽔印&#xff0c;这样做会有更好的浏览器兼容…

全球前十!小米积极推动5G标准制定,科技引领高速发展

5G是推动人类社会数字化转型升级的关键支撑&#xff0c;为打造全移动和全连接的智能社会提供技术基础&#xff0c;巨大且深刻地改变着我们的生活。 近日&#xff0c;中国信息通信研究院发布了《全球5G标准必要专利及标准提案研究报告&#xff08;2023年&#xff09;》&#xff…

【新版】系统架构设计师 - 纲要章节汇总

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 随时更新&#xff0c;请持续关注 … \color{#FF7D00}随时更新&#xff0c;请持续关注… 随时更新&#xff0c;请持续关注… 文章目录 上午题 - 综合知识计算机公共基础知识架构核心知识新增技术知识知识点地图 下午…

免费的配音软件--- tts-vue 软件 下载安装过程

视频效果 tts-vue 软件 图片效果 软件包含有; 语言: 高棉语(柬埔寨) 马耳他语(马耳他) 马来语(马来西亚) 马拉雅拉姆语(印度) 马拉地语(印度) 马其顿语(北马其顿) 韩语(韩国) 阿拉伯语(黎巴嫩) 阿拉伯语(阿昙) 阿拉伯语(阿拉伯联合酋长国) 阿拉伯语(阿尔及利亚) 阿拉伯语(约…

高速信号处理卡 光纤接入卡 设计方案: 519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡

519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡 一、板卡概述 本板卡系我司自主设计研发&#xff0c;基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构&#xff0c;支持PCIE Gen3x16模式。其中&#xff0c;ARM端搭载一组64-bit DDR4&#xff0c;总容…

Vue.js 中的 $emit 和 $on 方法有什么区别?

Vue.js 中的 $emit 和 $on 方法有什么区别&#xff1f; 在 Vue.js 中&#xff0c;$emit 和 $on 方法是两个常用的方法&#xff0c;用于实现组件间的通信。它们可以让我们在一个组件中触发一个自定义事件&#xff0c;并在另一个组件中监听这个事件&#xff0c;从而实现组件间的…

【AI实战】大语言模型(LLM)有多强?还需要做传统NLP任务吗(分词、词性标注、NER、情感分类、知识图谱、多伦对话管理等)

【AI实战】大语言模型&#xff08;LLM&#xff09;有多强&#xff1f;还需要做传统NLP任务吗&#xff08;分词、词性标注、NER、情感分类、多伦对话管理等&#xff09; 大语言模型大语言模型有多强&#xff1f;分词词性标注NER情感分类多伦对话管理知识图谱 总结 大语言模型 大…

PIC16F18877学习(一)

为什么要在PIC控制器中使用#pragma configs 这些设置位于程序代码之外的闪存中。 PIC一通电&#xff0c;它们就可用了&#xff0c;无论它们写在代码的哪个位置。这很重要&#xff0c;因为有时在执行程序之前需要它们。例如&#xff0c;有一些设置可以选择时钟源&#xff0c;并…

Docker 安装 Jenkins 并部署 Maven 项目

一、前言 在开始之前&#xff0c;我们需要保证系统中已经安装了Docker、JDK、Maven。 二、Docker 拉取镜像 我这里使用的是 2.344 版本的 Jenkins&#xff0c;拉取命令如下&#xff1a; docker pull jenkins/jenkins:2.344需要稍微等一会&#xff0c;等待拉取完成。 镜像下载…