【开懂C++】引用与关键字auto

news/2024/9/17 18:59:00/

在这里插入图片描述

目录

  • 一.引用
  • 1.引用的概念
  • 2.引用的使用和问题
  • 3.引用与指针的比较
    • 二.关键字auto

一.引用

1.引用的概念

引用就是给一个已经存在的变量取一个别名,与变量共用一段内存空间。注意引用的类型必须和变量类型相同,来演示下引用如何使用。

#include <iostream>
using namespace std;int main()
{int a = 1;int& b = a;int& c = b;int& d = c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;return 0;
}

如上面的代码所示:我们给a取了个别名b,给b取别名c…也就是b是a的引用,c是b的引用…。其实b,c,d都代表着a,它们都共用着一块内存空间
如下图所示:
在这里插入图片描述

2.引用的使用和问题

引用的注意事项:

  1. 引用必须初始化
  2. 引用不能更改
  3. 一个变量可以有多个引用

引用可以作为函数的参数也可以做返回值,在之前学习C语言我们常使用指针传参,也就是传址调用来改变外部变量的值。学习引用后,我们只用引用传参就会特别方便。
当返回引用时,就会引出很多问题,这里我们来解析下下面的代码:

int& Add()
{int n = 0;//静态变量static int a = 0;n++;return n;
}int main()
{int ret=Add();cout << ret << endl;return 0;
}

n在Add函数中变为1,Add返回了n的引用,我们用变量ret来接收n的引用也就是n的值,但是有个问题就是——n在出Add函数后函数栈帧如果被清理的话,函数返回引用找到的值就会是随机值。如果栈帧没有被清理,那ret侥幸是正确的1。为了避免这种情况我们可以将Add函数的n设为静态变量
为了验证,我们再看一下面的代码:

int& Add(int x)
{int n = x;n++;return n;
}int main()
{int& ret=Add(10);cout << ret << endl;Add(20);rand();cout << ret << endl;return 0;
}

假设出Add函数后栈帧不破坏那打印结果就是11\n21,但是我们调用个函数,模拟函数栈帧破坏的情况,那结果是不是像我们预想的那样为随机值呢。
在这里插入图片描述

总结
引用传参适合大部分的情况
将引用返回值时需要注意引用对象还是否出函数是否还存在

下面我们来看引用使用场景及其优点:
1.引用做参数-(输出型参数)
2.引用做参数-(减少拷贝提高效率) (大对象/深拷贝类对象)
3.引用做返回值-(减少拷贝提高效率) (大对象/深拷贝类对象)
4.引用做返回值-修改返回值+获取返回值

接下来再讲一下常引用、引用权限的放大、缩小、平移:

int func()
{stctic int a=0;a++;return a;
}
int main()
{//引用的权限可以平移和缩小不可以放大int a = 0;int& b = a;//平移const int& c = a;//缩小++a;++c;//放大const int a = 10;int& b = a;//只能给变量取别名double c = 3.14;int& d = c;//引用的类型需要匹配const int& e = c;//类型转换会创建临时变量 临时变量具有常量性质int& ret=func();//权限放大return 0;
}

语法层面上引用不会开空间知识对变量取得一个别名,而从底层汇编指令来看的话引用是类似指针的方式使用的。

3.引用与指针的比较

引用和指针有许多不同点:

  1. 引用需要初始化,指针不要求
  2. 引用不能修改,指针可以
  3. 有空指针,没有空引用
  4. 引用更为安全,指针可能出现野指针和越界等情况
  5. 在sizeof中引用是类型的字节大小,指针是根据机器位数来判断字节个数
  6. 引用在语法上定义一个变量的别名,指针储存一个变量的地址
  7. 有多级指针没有多级引用
  8. 指针需要根据地址解引用访问,引用是编译器自己处理的

二.关键字auto

auto可以自动识别类型,当类型过于复杂冗长时,auto使用起来非常的方便。

int main()
{int a = 1;auto b = 10;auto c = 3.14;
}

在同一行定义多个变量时,需要注意同一行的变量类型要一致,不然auto无法正确识别:

int main()
{auto a = 1, b = 2; auto c = 3, d = 4.0;//类型不同
}

auto还不能作为函数的参数以及定义数组

auto还有个重要的应用——范围for循环
他提供了一种更简便的for遍历的方法根据冒号”:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示迭代的范围。

int main()
{int arr[] = { 0,1,2,3,4,5,6 };for (auto x : arr)cout << x << endl;
}

http://www.ppmy.cn/news/44890.html

相关文章

xshell是什么软件

xshell是什么软件? Xshell 是一个强大的远程管理软件&#xff0c;它支持SSH&#xff0c;TELNET 协议。Xshell可以在Windows下访问远端服务器、路由器、网络机顶盒等&#xff0c;类似的常用软件还有putty&#xff0c;以及Windows下的Telnet。 下面简单介绍一下xshell软件。 X…

面试题React

1.React Fiber是什么&#xff1f; 在 React V16 将调度算法进行了重构&#xff0c; 将之前的 stack reconciler 重构成新版的 fiber reconciler&#xff0c;变成了具有链表和指针的 单链表树遍历算法。通过指针映射&#xff0c;每个单元都记录着遍历当下的上一步与下一步&…

银行数字化转型导师坚鹏:金融数据治理、数据安全政策解读

金融数据治理、数据安全政策解读及大数据应用 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何准确理解金融数据治理及数据安全相关政策 不清楚金融数据治理及数据安全相关政策对银行有什么影响&#xff1f; 不清楚如何有效应用金融数据治理及数据安…

LeetCode:376. 摆动序列——说什么贪心和动规~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;376. 摆动序列 题目描述&#xff1a;如果连续数字之间的差严格地在正数…

[golang gin框架] 23.Gin 商城项目-前台templates模板分离,首页,顶部导航,轮播图 左侧分类数据渲染

一.首页界面展示以及项目结构分析 首页界面展示 项目结构分析 二.代码展示 首页相关模型 首页相关模型如下: [golang gin框架] 21.Gin 商城项目-导航模块功能 [golang gin框架] 17.Gin 商城项目-商品分类模块, 商品类型模块,商品类型属性模块功能操作 [golang gin框架] 16.Gin …

科创人·中建三局一公司尹奎:数字化变革能创造全新行业,其意义超越形式、范式创新

尹奎 中建三局一公司技术中心主任 教授级高级工程师&#xff0c;BIM领域资深专家&#xff0c;完成10余个基于BIM的相关研究课题&#xff0c;获省部级以上科技进步奖 13 项&#xff1b;公开出版专著3部&#xff0c;参与编写“十二五”国家重点图书出版规划项目《BIM应用施工》&a…

实现一个登录功能方案设计2

需求MySQL表实现方案 index页面home页面 需求 实现一个登录功能 实现的功能 注册(邮箱注册) 登录(邮箱密码) 重置密码 查看操作记录(登录, 注册, 重置密码, 登出. 都算操作) 登出 在第一版的基础上进行优化:\ 优化点: 存操作信息 请求的post使用中间件进行储存操作信息.避免重复…

门面设计模式

目录 前言&#xff1a; 门面模式的原理与实现 门面模式的应用场景 1. 解决易用性问题 2. 解决性能问题 3.解决分布式事务问题 总结&#xff1a; 参考资料 前言&#xff1a; 相信我们平时的工作多多少少都涉及过接口设计&#xff0c;为了保证接口的可复用性&#xff0c;我…

【论文阅读】ViT阅读笔记

标题 一张图片可以等价于16*16的单词 transformer可以做大规模的图像识别 摘要 虽然现在transformer在nlp上得到广泛运用&#xff0c;但在cv上还没有运用 一般都是cnnattention 现在用transformer用cv的效果特别好 引言 nlp的主流方式&#xff1a;先做预训练&#xff0…

Linux -- 进阶 Web 服务器 基础前瞻 ( 一 )

目录 WWW 简介 &#xff1a; 组件一个网站得需要哪些东西呢 &#xff1f;&#xff1f; 1 得有 响应用户申请网页服务 的软件 2 服务器主机 3 那就需要数据了 4. 浏览器 预备知识 &#xff1a; 网址及HTTP 简介 &#xff1a; URL : http 请求方法 &#xff1a;…

SpringCloud微服务技术栈.黑马跟学(十二)

SpringCloud微服务技术栈.黑马跟学 十二 今日目标服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallback 1.2.消息持久化1.2.1.交换机持久化1.2.2.队列持久化1.2.3.消息持久化 1.3.消费者消息确认1.3.1.演示none模式…

Go 构建基础的事件调度器

&#x1f447;我在这儿 当我们需要在一段时间后的特定时间或间隔运行任务时&#xff0c;我们需要使用任务调度系统来运行任务&#xff1a;例如发送电子邮件、推送通知、午夜关闭账户、清空表格等。 在本文中&#xff0c;我们将构建一个基本的事件调度程序&#xff0c;使用数据…

LiangGaRy的学习分享

LiangGaRy的学习分享 从小白开始&#xff0c;学习计算机技术&#xff1b;也算是一个比较大的跨越了&#xff0c;专业不对口&#xff1b;本来就没有基础&#xff1b;然后一直摸爬滚打来学习&#xff1b;有好多的心得与体会&#xff1b; 回顾当年上大学的时候&#xff0c;天天玩…

LC-1041 困于环中的机器人(模拟,快慢指针找环)

1041. 困于环中的机器人 难度中等148 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。南方向 是y轴的负方向。东方向 是x轴的正方向。西方向 是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; "…

Codepipeline 跨账号访问 Codecommit

背景 大型企业中代码仓库通常存放在各部门开发账户中&#xff0c;而流水线则位于独立 DevOps 账户中。 本文我们将介绍如何创建跨账号访问 Codecommit 代码仓库的 Codepipeline 流水线&#xff0c;即 CodePipeline 调用另一个账号中的 Codecommit 代码仓库。 亚马逊云科技开发…

【嵌入式烧录/刷写文件】-5.1-详解map格式文件

目录 1 Map文件格式 1.1 TARGET SECTION字段 1.2 FILE SECTION字段 1.3 STARTUP SECTION字段 1.4 SECTION-ALLOCATION SECTION字段 1.5 VECTOR-ALLOCATION SECTION字段 1.6 OBJECT-ALLOCATION SECTION字段 1.7 MODULE STATISTIC字段 1.8 SECTION USE IN OBJECT-ALLOCA…

Nginx配置ssl证书实现https安全访问

目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件&#xff0c;拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx&#xff0c;则需查看自己的Nginx是否开启了SSL的模块功能&#xff1a; ./nginx -V 显…

C++类型转换运算符

类型转换运算符是一种特殊的函数&#xff0c;它可以将一个类类型的对象转换为另一种类型的值&#xff0c;或将一个对象引用或指针转换为另一种类型的对象引用或指针。这样一来&#xff0c;我们就可以在某些场合下方便地将一个对象转换为另一种形式。 在 C 中&#xff0c;类型转…

【好刊推荐】知名出版社影响因子7+被踢出SCI,投稿前如何选期刊?

今年3月Hindawi旗下的19本期刊被SCIE剔除&#xff0c;其中有一本影响因子7&#xff0c;以下从期刊各个指标方面分析一下具体原因&#xff1a; 期刊剔除&#xff1a;影响因子7 期刊简介 期刊名称&#xff1a; OXIDATIVE MEDICINE AND CELLULAR LONGEVITY ISSN / eISSN&#…

Grounding DINO-开集目标检测论文解读

文章目录摘要背景算法3.1Feature Extraction and Enhancer3.2. Language-Guided Query Selection3.3. Cross-Modality Decoder3.4. Sub-Sentence Level Text Feature3.5. Loss Function实验4.2 Zero-Shot Transfer of Grounding DINOCOCO数据集LVIS数据集ODinW&#xff0c;开放…