c++ 的引用

c++ 引用

引用的概念

应用不是重新去定义一个变量,而是给变量取别名。

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间

比如:

int a = 10;
int& b = a; //这就是一个引用操作。
// 1. 它的意思并不是把a的值给b
// 2. 也不是把a的地址给b;
// 3. 它的意思是给a取另外一个名字:b

就像:你叫 张伟 :int 张伟

给你取个外号叫张益达: int& 张益达 = 张伟

注意 & 这个符号,只有在int(类型) + & + b(变量) 只有在类型和变量中间才会表示引用的意思。

在其他地方可能有其他的意思:比如:

cout << &b << endl;
//这个时候 & 就是取地址的意思

由于引用共用一个内存空间:所以&a&b 是一样的地址。

并且:你对b++, a 也会++; 你对a++,b 也会++; 因为它们的内存空间是同一块的

就像:叫 张伟 是在叫你,叫 张益达 也是在叫你;

#include<iostream>using namespace std;void swap(int& a, int& b)  //有了引用,写交换函数就不用指针了
{int tmp = a;a = b;b = tmp;
}int main()
{int a = 10;int b = 12;swap(a, b);cout << a << endl;cout << b << endl;return 0;
}

注意:引用类型必须和引用实体是同种类型的 , 就是你给int a 取别名为 b , 那 b 也该是 int 类型的。int & b = a;

引用的特性

  1. 引用在定义时必须初始化, 即:int& b = a;

  2. 一个变量可以有多个引用,

    即:int& b = a; int& c = a; int& d = a, 可以给a 取别名为b, c, d 。甚至可以给别名取别名:int & b = e, int & c = f;

  3. 引用一旦引用一个实体,再不能引用其他实体 , 如上:b,c ,d, e, f已经是a的别名了,那么就不能作为其他变量的别名了

引用做返回值

传值返回

//传值返回
int count()
{int n = 0;n++;return n;       //传值返回并不是返回的n,因为程序在执行完这个函数后,这个函数的栈帧就会被销毁,n也就被销毁了,
}                //所以传值返回是将要返回的那个值拷贝一份放在一个地方,然后返回的拷贝的那个值int main()
{int ret = count();return 0;
}

传引用返回

//传引用返回
int& count()
{int n = 0;n++;return n;			//返回的值是n的别名//count 这个函数执行完后,它的函数栈帧也会被销毁,n也会被销毁,n 都被销毁了,n 的别名也没有任何意义了,//这种情况类似于野指针: 指针所指向的内容被销毁了,但你仍然在使用这个指针。
}                int main()
{int &ret = count();//所以这里打印的结果可能是1,也可能是随机值。为啥可能是1?因为你的栈帧虽然被销毁了但是那个空间可能还没有被覆盖,  cout << ret << endl;cout << ret << endl;return 0;
}

注意 如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
引用返回,如果已经还给系统了,则必须使用传值返回

常引用

在引用的过程中有以下的特点:

权限不能放大

const int a = 10;
int& b = a; //这种写法就是错的,因为a本来是被 const 限制了的,但是你给它取的别名没有被限制 

权限可以平移

const int a = 10;
const int& b= a;

权限可以缩小

int a = 10;
const int& b = a;

其他

int a = 10;
double& b = a; //这样的写法是错的,错误并不是因为类型不同。
//但是  加个const就行了
const double& b = a;
//因为在发生类型转换时会产生一个临时的变量,这里不是把a直接给b,而是把a给一个临时变量,这个临时变量是double类型
// 临时变量是具有常性的,临时变量如果直接给b的话,就相当于权限的放大了
// 所以我们用const限制一下b  	  

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

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

相关文章

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客&#xff1a;OpenCV实现将任意形状ROI区域置黑&#xff08;多边形区域置黑&#xff09; 比较常用的是使用 Rect 矩形实现该功能&#xff0c;代码如下&…

打造i-SMART智能网联平台,亚马逊云科技助力上汽快速出海

当前在各大外资车企不断加码在华投资之际&#xff0c;越来越多的中国汽车品牌纷纷开始走出国门&#xff0c;加速推进全球化业务&#xff0c;将赛道转至更为广阔的海外市场。 上汽海外出行科技有限公司&#xff08;简称“上汽海外出行”&#xff09;成立于2018年&#xff0c;承…

linux高并发web服务器开发(web服务器)18_函数解析http请求, 正则表达式,sscanf使用,http中数据特殊字符编码解码

pdf详情版 01 学习目标 编写函数解析http请求 ○ GET /hello.html HTTP/1.1\r\n ○ 将上述字符串分为三部分解析出来编写函数根据文件后缀&#xff0c;返回对应的文件类型sscanf - 读取格式化的字符串中的数据 ○ 使用正则表达式拆分 ○ [^ ]的用法通过浏览器请求目录数据 ○…

【unity之IMGUI实践】单例模式管理数据存储【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

每日一题——迷宫问题(I)

迷宫问题——I 题目链接 思路 创建二维数组&#xff0c;并实现输入 首先输入二维数组的行和列&#xff1a; int n, m; scanf("%d%d", &n, &m);然后动态开辟二维数组&#xff1a; 注&#xff1a;对动态开辟还不太了解的同学可以看看&#x1f449;C语言—…

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…

opencv-15 数字水印原理

最低有效位&#xff08;Least Significant Bit&#xff0c;LSB&#xff09;指的是一个二进制数中的第 0 位&#xff08;即最低位&#xff09;。 最低有效位信息隐藏指的是&#xff0c;将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位&#xff0c;即将载体图像的最低有效…

再开源一款轻量内存池

前两天已开源线程池&#xff0c;开源一款轻量线程池项目&#xff0c;本节继续开源另一个孪生兄弟&#xff1a;内存池。 本节的线程池与内存池代码解析会在我的星球详细讲解。 内存池&#xff1a;https://github.com/Light-City/light-memory-pool 线程池&#xff1a;https://gi…

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用Python图像处理库Pillow&#xff0c;帮助大家进一步了解Python的基本概念&#xff1a;模块、对象、方法和函数的使用 使用Python语言解决实际问题时&#xff0c;往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理…

Java设计模式-单例模式

单例模式 1.单例模式含义 单例模式就是保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 其实单例模式很好理解&#xff0c;当我们new一个对象实例的时候&#xff0c;这个对象会被放到一个内存中&#xff0c;当我们再次new同一个对象的实例的时候&#xf…

ES6模块化与异步编程高级用法

目录 ES6 模块化 1、什么是 ES6 模块化规范 2、在 node.js 中体验 ES6 模块化 3、ES6 模块化的基本语法 Promise 1. 回调地狱 2、Promise 的基本概念 3、基于回调函数按顺序读取文件内容 4.、基于 then-fs 读取文件内容 4.1 then-fs 的基本使用 4.2 .then() 方法的特…

ZooKeeper原理剖析

1.ZooKeeper简介 ZooKeeper是一个分布式、高可用性的协调服务。在大数据产品中主要提供两个功能&#xff1a; 帮助系统避免单点故障&#xff0c;建立可靠的应用程序。提供分布式协作服务和维护配置信息。 2.ZooKeeper结构 ZooKeeper集群中的节点分为三种角色&#xff1a;Le…

SSH客户端连接远程服务器

目录 一、什么是客户端连接远程服务器 二、什么是服务端连接远程服务器 三、查看网络信息 1、图形程序查看网络信息 2、命令查看网络信息 四、SSH客户端&#xff08;Linux&#xff09; 五、SSH客户端&#xff08;windows&#xff09; 六、SSH远程服务器 一、什么是客户…

75、简述你对RPC、RMI的理解

简述你对RPC、RMI的理解 RPC&#xff1a;在本地调用远程的函数&#xff0c;远程过程调用&#xff0c;可以跨语言实现 httpClient RMI&#xff1a;远程方法调用&#xff0c;java中用于实现RPC的一种机制&#xff0c;RPC的java版本&#xff0c;是J2EE的网络调用机制&#xff0c…

git如何撤销commit(未push)

文章目录 前言undo commitreset current branch to here Undo Commit&#xff0c;Revert Commit&#xff0c;Drop Commit的区别 是否删除对代码的修改是否删除Commit记录是否会新增Commit记录Undo Commit不会未Push会&#xff0c;已Push不会不会Revert Commit会不会会Drop Com…

jQuery.print打印插件的使用方法

网站新闻内容页面&#xff0c;想只打印新闻内容区域&#xff0c;其他区域不打印&#xff0c;使用了jQuery.print插件&#xff0c;插件下载地址&#xff1a;GitHub - DoersGuild/jQuery.print: Easy to use, Element Printing Plugin for jQuery 插件下载地址&#xff1a;https:…

vue 3.0 如何加载图片

.logo { background: url(~/assets/images/logo.svg) no-repeat center center/contain; width: 117px; height: 24px; margin: 0 20px; } <a class"logo" href"#"></a> 比较实用的书写方式

汽车销售数据可视化分析实战

1、任务 市场需求&#xff1a;各年度汽车总销量及环比&#xff0c;各车类、级别车辆销量及环比 消费能力/价位认知&#xff1a;车辆销售规模及环比、不同价位车销量及环比 企业/品牌竞争&#xff1a;各车系、厂商、品牌车销量及环比&#xff0c;市占率及变化趋势 热销车型&…

OBS 基础 之 使用到的坐标体系 及转换

目录 一、画布坐标 1、画布宽高 2、设置LOGO位置 二、预览窗口坐标

python多线程排查

问题 公司服务总是莫名其妙的cpu饱满排查了代码中的定时任务&#xff0c;排除之后仍经常出现类似问题。是时候debug了 排查过程 cpu劣化是一个过程&#xff0c;cpu持续增长到60%&#xff0c;然后突然服务雪崩不服务了。排查下来看sleep的物理线程和cpu增长的幅度一致 那么…