【C++初阶】C++入门(下)

【C++初阶】C++入门(下)

🥕个人主页:开敲🍉

🥕所属专栏:C++🥭

🌼文章目录🌼

6. 引用

    6.1 引用的概念

    6.2 引用特性

    6.3 常引用

    6.4 使用场景

    6.5 传值、传引用效率比较

    6.6 引用和指针的区别

7. 内联函数

    7.1 内联函数的概念

    7.2 特性

8. 指针空值nullptr

6. 引用
    6.1 引用的概念

  引用不是定义一个新的变量,而是给一个已有的变量取别名,因此引用并不会开辟额外的空间,它跟它引用的变量共用一块空间。举个简单的例子:有个人名字叫张小明,在家里他爸妈给他取了一个小名叫明明,在学校同学们给他取了个名字叫小明,这里的明明和小明都可以理解为张小明的引用,它们所指向的对象都是张小明。

  引用:类型 & 引用变量名 = 引用实体:

因为pa就是a,所以改变pa的值自然也就会改变a的值,因为操作pa就是在操作a:

  注意:引用类型必须和引用对象是相同类型的!

    6.2 引用特性

引动在定义时必须初始化,换句话说,引用必须指向一个对象,不能空引用

一个变量可以有多个引用,这点也很好理解,就像上面的张小明,在家里他爸妈叫他明明,在学校同学叫他小明:

 引用一旦指向了某个对象,则不能再更改引用的对象

    6.3 常引用

权限放大:

  由此可以知道权限放大是错误的,不合法的。

权限缩小:

  由此可以知道权限缩小是合法的。

    6.4 使用场景

做参数

  在过去我们学习C语言时,想要将两个变量的值进行交换,我们写出的交换函数是这样的:

会不会觉得这样挺麻烦的,又要进行取地址操作&,又要进行解引用操作。

现在,我们学习了引用之后,我们就可以这样写:

能够这样写的原理就是上面说的,引用是对一个变量取别名,对这个别名的操作就是对变量本身的操作。

② 做返回值

    6.5 传值、传引用效率比较

  以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直
接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效
率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

    6.6 引用和指针的区别

  引用是变量的一个别名,并不会开辟额外的空间,它和它引用的对象共用一块空间,对引用的操作就是对变量的操作,属于直接操作而指针是一块地址,它保存所指向对象的地址,因此指针开辟了额外的空间,对变量操作需要对指针解引用,因此属于间接操作引用在定义时必须初始化,而指针初不初始化都行不能出现空引用,可以出现空指针在sizeof中引用的大小就是所指向对象类型的大小,而指针始终为地址所占的空间大小(32位平台下为4个字节);

总结:

 引用概念上定义一个变量的别名,指针存储一个变量地址。

引用在定义时必须初始化,指针可以不初始化

引用在指向了一个对象后不能再更改,而指针可以随便指向任何同一类型的对象

不能出现空引用,可以出现空指针

在sizeof中的含义不同:引用为指向对象类型的大小,指针固定为地址的大小(32位平台下为4个字节)

对引用的操作就是对变量的直接操作,指针对变量操作需要解引用,属于间接操作

引用比指针使用起来相对更加安全

7. 内联函数
    7.1 内联函数的概念

  以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方将其展开(不是一定的,这取决于编译器是否将其看作内联函数),没有函数调用建立的栈帧开销,因此内联函数提升了运行的效率。

  如上图,没有使用内联函数时,反汇编中会有一句call指令,这说明编译器为这个函数开辟了一块栈帧,产生了空间的消耗。

  如上图,使用内联函数后,编译器会将内联函数展开,因此没有了栈帧的创建。

    7.2 特性

inline是一种以空间换时间的做法,如果编译器将函数当作内联函数处理,在编译阶段,编译器会将内联函数展开缺陷:可能会使代码量变大;优点:少了栈帧的创建,提高了运行效率。

inline对于编译器来说只是一种建议,编译器是否会将其看作是内联函数取决于编译器本身,不同的编译器判断不一样。一般:当函数规模较小、非递归、函数频繁调用时可以采用inline修饰,否则编译器可能不会将其看作为内联函数。下图为《C++ Prime》第五版对inline的建议:

inline不建议声明和定义分离,如果将inline的声明和定义分离会导致链接错误。因为当inline被展开后就没有了地址(没有开辟栈帧),链接时就找不到它。

8. 指针空值nullptr

  在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现
不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下
方式对其进行初始化:

  NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

  可以看到,在C++中,NULL为常量0;在C语言中,NULL为void*类型的常量。但是无论是哪种形式,在使用NULL时都不可避免会遇到一些麻烦,比如:

  可以看到,func(NULL)的调用初衷是想调用第二个func,但是却调用了第一个,这就产生了歧义。

  在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器
默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)0。

  因此在C++中,我们最好使用nullptr关键字来替代NULLnullptr是专门用于指针类型的指针,而NULL即能代表常量0,又能代表(void*)类型的常量,出现歧义。

  注意:

在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为关键字引入的。

在C++11中,sizeof(nullptr)与sizeof((void*)0)所占字节大小相同。

为了提高代码的健壮性,在后续表示指针空指时最好都使用nullptr。

                                                  创作不易,点个赞呗,蟹蟹啦~

                                                         

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven 依赖冲突

依赖冲突 1、对于 Maven 而言&#xff0c;同一个 groupId 同一个 artifactId 下&#xff0c;只能使用一个 version。 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 --><dependency><groupId>org.apache.commons</groupId&…

【栈和队列】

目录 一、栈1.1、栈的基本概念1.2、栈的基本操作1.3、栈的顺序存储实现1.3.1、顺序栈的定义1.3.2、顺序栈的初始化1.3.3、顺序栈的入栈和出栈1.3.4、读取栈顶元素1.3.5、共享栈&#xff08;即两个栈共享同一片空间&#xff09; 1.4、栈的链式存储实现1.4.1、链栈的定义1.4.2、链…

Hugging Face使用笔记

1. HuggingFace简介 Hugging Face Hub和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; 模型仓库&#xff08;Model Repository&#xff09;&#xff1a;Git仓库可以让你管理代码版…

永磁同步电机参数辨识算法--模型参考自适应辨识电感

本文采用 MRAS 在线辨识电感参数&#xff08;Ld、Lq&#xff09; 一、原理介绍 从组成部分来看&#xff0c;MRAS由三个重要部分构成分别为参考、可调以及自适应律。参考模型相当于IPMSM 参数实时变化的准确值&#xff0c;即作为可调模型的参考值&#xff0c;可调模型依据参数…

ARM功耗管理标准接口之ACPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…

深度学习pytorch多机多卡网络配置桥接方法

1 安装pdsh&#xff08;Parallel Distributed Shell&#xff09; sudo apt install pdsh sudo -s # 切换超级用户身份 …

51.通过获取数据快速实现一个辅助

上一个内容&#xff1a;50.破坏性更小的代码跳转功能完善&#xff08;无敌秒杀&#xff09; 原理是&#xff1a;找一个现成的辅助&#xff0c;使用PCHunter工具看现成辅助对目标游戏做了那些hook操作&#xff0c;然后再使用Ollydbg.exe工具分析现成辅助为何这样做。 下图左边…

react_web自定义组件_多类型Modal_搜索栏Search

目录 一、带输入框的Modal 二、提示框Modal 三、搜索栏Search 在做项目时引入一些现成的UI组件&#xff0c;但是如果和设计图冲突太大&#xff0c;更改时很麻烦&#xff0c;如果自己写一个通用组件其实也就几十分钟或者几个小时&#xff0c;而且更具UI设计更改也比较好更改&…

MD5加密和注册页面的编写

MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…

LLM 研究方向(一): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…

告别堆积,迎接清新:回收小程序,打造无废生活新选择

在快节奏的现代生活中&#xff0c;物质的丰富与便利似乎成为了我们日常的一部分&#xff0c;但随之而来的&#xff0c;是日益增长的废弃物堆积问题。街道边、社区里&#xff0c;甚至是我们的家中&#xff0c;废弃物品仿佛无孔不入&#xff0c;逐渐侵蚀着我们的生活空间与环境质…

研华运动控制卡在LabVIEW中的应用

在现代工业和科研领域中&#xff0c;精密运动控制系统的需求日益增加。这些系统广泛应用于自动化生产线、精密机械加工、机器人控制、光学仪器调试和实验室自动化设备等诸多领域。本文以研华公司的运动控制卡为例&#xff0c;详细介绍其在LabVIEW中的应用&#xff0c;展示如何通…

丑数问题,力扣264,坑点

丑数问题&#xff0c;力扣264&#xff0c;坑点 力扣链接 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;12 解释&#xff1a;[1, 2, 3, 4, 5, 6, 8, 9, …

鸿蒙语言基础类库:【@ohos.util.TreeSet (非线性容器TreeSet)】

非线性容器TreeSet 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 T…

MT3056 交换序列

思路&#xff1a; 与题目 MT3055 交换排列 类似 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e4 10; int n, fa[N], b[N], d[N]; void init(int n) {for (int i 1; i < n; i)fa[i] i; } int find(int x) {return x fa[x] ?…

使用 MinIO 赢得 RAG 权利

人们常说&#xff0c;在人工智能时代&#xff0c;数据是你的护城河。为此&#xff0c;构建生产级 RAG 应用程序需要合适的数据基础架构来存储、版本控制、处理、评估和查询构成专有语料库的数据块。由于 MinIO 采用数据优先的 AI 方法&#xff0c;因此对于此类项目&#xff0c;…

搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件

Scalefit是一款可在工作场所自动处理 3D 姿势分析结果的软件。这甚至可以在衡量员工的同时发生。然后&#xff0c;Scalefit 根据国际标准对姿势、压缩力和关节力矩进行分析和可视化。 3D姿势分析 如今&#xff0c;Xsens 技术可让您快速测量工作场所员工的态度。一套带有 17 个…

高考后暑假新选择:从AI聊天机器人开发入门IT领域

你好&#xff0c;我是三桥君 七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。 不知道这些有志于踏入IT领域的高考少年们&…

对比学习和多模态任务

1. 对比学习 对比学习&#xff08;Contrastive Learning&#xff09;是一种自监督学习的方法&#xff0c;旨在通过比较数据表示空间中的不同样本来学习有用的特征表示。其核心思想是通过最大化同类样本之间的相似性&#xff08;或降低它们之间的距离&#xff09;&#xff0c;同…

香橙派5plus上跑云手机方案二 waydroid

前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案&#xff0c;这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行&#xff0c;但是体验下来只能用软件加速&#xff0c;无法使用GPU加速&#xff0c;所有会很卡。而且…