news 2026/6/14 8:18:07

一文详解C++中的引用与关键字auto

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文详解C++中的引用与关键字auto

一.引用

1.引用的概念

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <iostream>

usingnamespacestd;

intmain()

{

inta = 1;

int& b = a;

int& c = b;

int& d = c;

cout << &a << endl;

cout << &b << endl;

cout << &c << endl;

cout << &d << endl;

return0;

}

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

如下图所示:

2.引用的使用和问题

引用的注意事项:

  • 引用必须初始化
  • 引用不能更改
  • 一个变量可以有多个引用

引用可以作为函数的参数也可以做返回值,在之前学习C语言我们常使用指针传参,也就是传址调用来改变外部变量的值。学习引用后,我们只用引用传参就会特别方便。

当返回引用时,就会引出很多问题,这里我们来解析下下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

int& Add()

{

intn = 0;//静态变量static int a = 0;

n++;

returnn;

}

intmain()

{

intret=Add();

cout << ret << endl;

return0;

}

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

为了验证,我们再看一下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

int& Add(intx)

{

intn = x;

n++;

returnn;

}

intmain()

{

int& ret=Add(10);

cout << ret << endl;

Add(20);

rand();

cout << ret << endl;

return0;

}

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

总结

引用传参适合大部分的情况

将引用返回值时需要注意引用对象还是否出函数是否还存在。

下面我们来看引用使用场景及其优点:

1.引用做参数-(输出型参数)

2.引用做参数-(减少拷贝提高效率) (大对象/深拷贝类对象)

3.引用做返回值-(减少拷贝提高效率) (大对象/深拷贝类对象)

4.引用做返回值-修改返回值+获取返回值

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

intfunc()

{

stcticinta=0;

a++;

returna;

}

intmain()

{

//引用的权限可以平移和缩小不可以放大

inta = 0;

int& b = a;//平移

constint& c = a;//缩小

++a;

++c;//放大

constinta = 10;

int& b = a;//只能给变量取别名

doublec = 3.14;

int& d = c;//引用的类型需要匹配

constint& e = c;//类型转换会创建临时变量 临时变量具有常量性质

int& ret=func();//权限放大

return0;

}

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

3.引用与指针的比较

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

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

二.关键字auto

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

1

2

3

4

5

6

intmain()

{

inta = 1;

auto b = 10;

auto c = 3.14;

}

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

1

2

3

4

5

intmain()

{

auto a = 1, b = 2;

auto c = 3, d = 4.0;//类型不同

}

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

auto还有个重要的应用——范围for循环

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 8:12:57

实测对比:丁烷打火机 vs 老式柰燃料打火机,火焰温度到底差多少?

丁烷与柰燃料打火机火焰温度实测&#xff1a;数据差异与安全指南火焰温度是衡量打火机性能的重要指标之一&#xff0c;但市面上关于丁烷打火机与老式柰燃料打火机的实际温度数据却众说纷纭。为了验证这些说法&#xff0c;我决定进行一次系统的实测对比。这次实验不仅关注理论上…

作者头像 李华
网站建设 2026/6/14 8:12:50

高性能实时通信服务器:MonaServer架构深度解析

高性能实时通信服务器&#xff1a;MonaServer架构深度解析 【免费下载链接】MonaServer A lightweight RTMFP, RTMP, WebSocket and HTTP server! 项目地址: https://gitcode.com/gh_mirrors/mo/MonaServer MonaServer是一款轻量级、高性能的实时通信服务器&#xff0c;…

作者头像 李华
网站建设 2026/6/14 8:12:29

SillyTavern终极性能优化指南:如何让AI聊天响应速度提升50%+

SillyTavern终极性能优化指南&#xff1a;如何让AI聊天响应速度提升50% 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 还在为SillyTavern的响应延迟和界面卡顿而烦恼吗&#xff1f;作为一…

作者头像 李华
网站建设 2026/6/14 8:04:58

AI Agent Runtime 正在成为新基础设施:从沙箱到会话日志的架构演进

1. 这不是新赛道&#xff0c;而是 runtime 层的“操作系统时刻”正在重演你打开终端&#xff0c;敲下docker run -it ubuntu:24.04&#xff0c;几秒后一个干净、隔离、可复现的 Linux 环境就跑起来了——你根本不用关心它底层是跑在 Intel 还是 AMD 芯片上&#xff0c;也不用操…

作者头像 李华
网站建设 2026/6/14 8:03:55

SQL中间态硬功夫:触发器、窗口函数、游标分页与COALESCE实战

1. 这4个SQL查询&#xff0c;为什么是数据从业者真正用得上的“中间态”硬功夫&#xff1f;你有没有过这种经历&#xff1a;刚学完SELECT、WHERE、GROUP BY&#xff0c;信心满满去处理业务数据&#xff0c;结果发现——产品经理突然要你“实时拦截所有年龄小于18岁的注册请求&a…

作者头像 李华
网站建设 2026/6/14 8:01:16

乳腺癌生存预测的多模态机器学习框架解析与应用

1. 乳腺癌生存预测的多模态机器学习框架解析在临床肿瘤学领域&#xff0c;准确预测乳腺癌患者的5年生存率对于制定个性化治疗方案至关重要。传统统计方法如Cox比例风险模型虽然广泛应用&#xff0c;但在处理现代多组学数据时面临维度灾难和复杂交互效应的挑战。我们开发了一个整…

作者头像 李华