自修C++PrimerPlus--类型转换、右值引用、引用中的类对象

目录

1.类型转换介绍

2.关闭vs2022的报警系统

3.string里面的I/O

4.引用和左值引用

4.1左值和右值的说明

4.2具体的代码演示

4.3字符和字符串的const区分

4.4右值引用的示例介绍

5.将引用应用于类对象

6.函数和C风格字符串

6.1两者的区别

6.2演示案例


1.类型转换介绍

我们的定义的时候两个变量都是短整型,但是相加之后的这个计算的结果却是转换成为两个int进行相加,然后把这个int类型的数据转换为这个short赋值给我们的这个folw变量,即使这个变量是short类型的,我们进行运算的时候也不会直接去使用这个short类型的数据相加,而是使用这个计算机最自然的语言:int,计算的速度很快,计算之后把这个结果转换为我们的这个接受变量的数据类型即可;

这个就是C++11标准里面添加上的这个auto声明,这个意义就是我们的这个变量的类型比较长的时候,我们就可以直接使用这个auto进行这个类型的识别,但是对于这个普通的简单的这个int类型之类的变量,我们也没有使用的这个必要;

2.关闭vs2022的报警系统

什么情况下需要关闭这个报警系统呢,就是我们的这个代码在编写的时候,这个系统的报错是因为这个编译器过于严谨造成的(有的编译器可能不会报错,这个和编译器有关)

例如下面的这个实例,我们想要把这个arr2拷贝到这个arr里面去,这个arr的大小就是20,但是这个arr如果里面的这个元素个数大于20的话,就会有潜在的风险,这个编译器就是为了安全考虑的,但是显然我们的这个地方不会出现这个问题,因此我们可以使用一行代码关闭这个地方的报警提示的功能,就是下面的这个里面的第五行代码;

3.string里面的I/O

下面的这个就是对于这个字符串和string的输入输出的一个介绍,其中这个里面的数组我们测试了两个不同的情况,就是有没有进行初始化的操作;

没有进行初始化的操作的数组,他在求解这个长度的时候就会一直向后面找,直到找到这个斜杠0为止,这个就会打印出来一个随机值,这个时候我们是没有办法猜到这个打印的结果的;

如果是进行了初始化的这个数组,我们的这个strlen求解长度的数值就是确定的;

string就不同了,没有进行初始化的时候,这个默认的设置这个string的长度就是0,因为这个string的大小是可以根据这个实际情况进行自动的调配的,这个就是string和c风格的字符串比较明显的一个区别,string的I/O实际上就是string里面的输入输出,就是介绍的这个string和字符串的一个区别

4.引用和左值引用

4.1左值和右值的说明

简单的讲,左值就是可以取地址的东西,右值就是不可以进行取地址操作的东西,下面通过几个案例进行介绍:

在上面的这个代码里面,我们的变量a是可以直接取地址的,因此这个a就可以作为引用的参数,就是作为一个变量的别名(绰号),但是像这个具体的数值,或者是字符,以及这个表达式(a+3)这种的,我们如果对于上面的这几种进行取地址的操作,就会报错,因此他们这几类是不可以进行取地址操作的,也就是说不可以作为某一个变量的引用;

我们的这个引用可以使用int&b=a,但是不可以写作int &b=10这种,凡是右值,像这个字符,表达式以及这个具体的数值,都是右值,因此就不可以出现在这个引用表达式的右边;

4.2具体的代码演示

我们的这个右值虽然不可以直接出现在我们一般的这个引用表达式里面,但是我们可以使用加上这个const进行修饰之后,上面的这个引用就可以正常使用了;

原来,我们直接在这个引用表达式的右边写上10,肯定是会报错的,因为这个10无法进行取地址的操作,也就是说这个10是右值,但是我们在这个前面加上这个const进行修饰之后,这个报错的信息就会消失;

这个实际上是因为我们加上这个const修饰之后,这个10就会赋值给一个temp临时变量,这个temp临时变量再去充当我们的引用值;

4.3字符和字符串的const区分

我们的这个const int& bb=10加上const是因为这个10本身不可以进行取地址的操作,加上const之后是为了生成temp,把临时变量这个左值作为引用;

下面的这个const string&str =" hello"这个加上const是因为我们的这个右边是常量,不可以进行修改,加上const是为了防止修改,这个hello这个字符串本身是可以取地址的;

因此,上面的两个const之间的这个作用是有区别的,我们等号右边的两个东西一个是可以取地址,一个不可以取地址,const在这两个里面的作用是不一样的;

4.4右值引用的示例介绍

就是原来不可以引用的右值,我们可以通过添加两个&&进行右值引用吗,这个也是一个语法规则,大致了解即可,后面我们会遇到这个右值引用的具体示例;

5.将引用应用于类对象

下面的这个其实就是引用的一个很简单的用法,但是这个里面可以让我们对于上面的这个知识进行综合的理解:

  1. 首先看到这个里面的函数的参数,两个参数都是const类型的,第一个的形参和实参都是string类型的,但是第二个参数里面的这个实参是字符串,但是形参是string,这个其实可以使用我们的上面的这个右值引用解释这个类型的不匹配的问题,一个是char*类型的字符串,一个是string类型的,这个时候加上const解决这个问题;
  2. 为什么加上const解决这个问题,因为加上const之后,这个就会产生一个临时的变量,其实实际上这个char*类型的字符串是可以取地址的,这个其实和上面的原理一样;
  3. 下面的这个程序实际上就是有问题的,因为这个自定义函数里面的这个临时变量temp出了作用域之后就会被销毁,这个时候他的引用和他无法使用同一块内存空间,因此这个程序就会崩溃;
  4. 正常的这个解决方法就是使用这个普通的传值返回就可以避免了;

6.函数和C风格字符串

6.1两者的区别

下面的这个文字说明了c风格字符串和char数组的区别,就是有没有斜杠0作为结束标志;

如果使用char*,我们可以使用这个循环。判断语句控制这个过程,直到遇到空值字符为止;

6.2演示案例

  1. 这个地方的函数参数是n,但是表示的是元素的个数,我们在这个末尾要加上\0,因此动态开辟的空间的大小就是n+1的大小;
  2. 我们的这个ps是一个char*类型的,可以理解为是一个数组,一次打印的时候是ps打印;
  3. while循环里面是先判断,再减减,最后是对于这个pstr[0]进行赋值,注意这个终止条件的判断;

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

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

相关文章

学习图解算法 使用C语言

图解算法 使用C语言 也就是通过C语言实现各种算法 链接:百度云盘 提取码:1001

中国空间计算产业链发展分析

2024中国空间计算产业链拆解 空间计算设备主要包括AR、VR、MR等终端设备。VR设备通常包括头戴式显示器(VR头盔)、手柄或追踪器等组件,用以完全封闭用户视野,营造虚拟环境体验。这些设备配备高分辨率显示屏、内置传感器和跟踪器。 …

哪些行业需要办理网络文化经营许可证?

网络文化经营许可证,是指经文化行政部门和电信管理机构批准,颁发给从事经营性互联网文化活动的互联网信息服务提供者的市场合法准入资质。经营性互联网文化活动是指以营利为目的,通过向上网用户收费或者电子商务、广告、赞助等方式获取利益&a…

linux 内核代码学习(九)--Linux内核启动和文件系统

一个比较顺手的学习平台可以达到事半功倍的效果,这里使用的平台环境主要是利用了主机和从机间的文件共享,以及从机自带的编译环境可以比较顺利的编译busybox1.0版本,方便进行内核和文件系统的测试了学习。 主机环境:vmware7.0win1…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则

文章目录 垃圾回收机制堆空间的基本结构内存分配和回收规则对象优先在 Eden 区分配分配担保机制 大对象直接进入老年代长期存活的对象进入老年代主要进行 GC 的区域部分收集 (Partial GC):Minor GCMajor/Old GCMixed GC 整堆收集(Full GC) 空…

时序必读论文10|ICLR23 Crossformer 跨维度依赖的多变量时序预测模型

论文标题:iCROSSFORMER : TRANSFORMER UTILIZING CROSS DIMENSION DEPENDENCY FOR MULTIVARIATE TIME SERIES FORECASTING 开源代码:https://github.com/Thinklab-SJTU/Crossformer 前言 Crossformer是一篇非常典型的在transformer基础上魔改注意力机…

24/9/16 算法笔记 评估模型

评估机器学习模型的性能是一个关键步骤,它可以帮助我们了解模型在实际应用中的表现。以下是一些常用的评估模型的方法: 准确率(Accuracy): 最常见的评估指标,表示正确预测的样本数占总样本数的比例。 精确度…

Linux命令:文本处理工具sed详解

目录 一、概述 二、用法 1、基本语法 2、常用选项 3、命令格式 4、编辑命令 5、获取帮助 三、 示例 1、替换字符串 2、删除行 (1)删除包含"string"的所有行 ​编辑 (2)删除从第1行到第10行的所有行 3、插…

MySQL篇(运算符)(持续更新迭代)

目录 一、简介 二、运算符使用 1. 算术运算符 1.1. 加法运算符 1.2. 减法运算符 1.3. 乘法与除法运算符 1.4. 求模(求余)运算符 2. 比较运算符 2.1. 等号运算符 2.2. 安全等于运算符 2.3. 不等于运算符 2.4. 空运算符 2.5. 非空运算符 2.6.…

java -- JDBC

一.JDBC概述: 过java语言操作数据库中的数据。 1.JDBC概念 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于 执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以 为不同的关系型数据库提供统一访问,它由…

CORS跨域请求共享

参考文章: https://xz.aliyun.com/t/12001?time__1311GqGxRGiti%3Dd052x%2BxCwx7qGIxpbDulE%3DoD https://blog.csdn.net/weixin_46622976/article/details/128452494 跨域资源共享 自己的理解,一般来讲,我们使用未授权的接口漏洞,都是因…

Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)

前言: 在本章中,我们开始编写面向用户的界面,其中只涉及简单的HTML结构,不会做太多美化,目的就是把后台创建的数据展示到前台。 从技术上来讲,这一节将涉及Django 中function view和 class-based view 的用…

robosuite基础教程(一)——基本概念

robosuite和robomimic都是由ARISE Initiative开发的开源工具,旨在推进机器人学习和机器人操作领域的研究。 一、基本概念 robosuite是一个由MuJoCo物理引擎驱动的模拟框架,专为机器人学习设计。它提供了一套基准环境,是Advancing Robot Int…

Linux实操笔记2 Ubuntu安装Nginx的不同方法

今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。 一、Nginx是什么? 以下是来自Nginx中文文档的内容。 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比…

瓶中水位检测系统源码分享

瓶中水位检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

研1日记13

正态分布: toTenor:转数字变为0-1 加载模型: model youmodel() model.load("路径") 测试单个样本:

模特妙善:一位多才多艺的短视频达人,绽放新光彩

模特妙善,在当今多元化的网络时代,短视频已成为人们生活中不可或缺的一部分。而在这一领域中,有一位以其独特魅力和多才多艺而备受瞩目的达人,她就是妙善,本名高艳芳。 模特妙善,出生于山西省的著名景点——…

fiddler抓包01:工具介绍

课程大纲 fiddler是一款常见的抓包工具,可以对web端和移动端的接口请求进行抓包(截获)、分析、编辑、模拟等,还可以导出jmeter、Loadrunner测试脚本。 1、原理 fiddler作为代理服务器,拦截请求和服务器响应。 2、使用…

PCIe进阶之TL:Request Handling Rules

1 Handling of Received TLPs 本节介绍接收到的 TLP 在数据链路层经过完整性验证之后,这些 TLP 在事务处理层时的处理方式。这些规则如下图所示: 接收侧会忽略保留字段。如果 Fmt 字段显示存在至少一个 TLP Prefix : (1)通过检查后续 DWORD 的第一个字节中的 Fmt 字段,…

【数据结构】第八节:链式二叉树

个人主页: NiKo 数据结构专栏: 数据结构与算法 源码获取:Gitee——数据结构 一、二叉树的链式结构 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left; // 左子树根节点struct BinaryT…