从c到c++——4:引用

news2024/11/17 15:34:56

前言   

    在《水浒传》中,梁山一百零八好汉,每个人都有一个响亮的外号,比如,当我们提到李逵和提到黑旋风提到铁牛时,本质上我们指的是同一个人。黑旋风江州劫法场,那李逵,铁牛也有江州劫法场的经历。引用也是这个道理。


引用

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

可以看出,a和b的关系就如同鲁迅和周树人的关系一样,a和b指向同一个内存空间。

合法的引用语法要求为:

  1. 引用必须初始化
  2. 引用定义后不能改变指向  (由于这条特性,引用不能完全代替指针)
  3. 一个变量可以有多个引用
int a = 10;

int& b = a;	//正确
int& c = 10;//错误,不能对常量引用
int& d;		//错误,没有初始化

引用做参数传参

        把引用作为函数的参数传递,由于他们两个指向的是同一块内存空间,可以通过修改引用的值来间接修改函数外变量的值。

        举个例子,在c风格的swap函数中,需要通过传地址来间接修改值,在cpp中使用引用就可以不调用指针实现。

//c
void swap_c(int* x, int* y)
{
	int tmp = *x;	*x = *y;	*y = tmp;
}
//c++
void swap_cpp(int& x, int& y)
{
	int tmp = x;	x = y;	y = x;
}

用引用来代替指针是一个不错的做法,可以显著提高代码可读性,但是由于引用不能修改指向,所以引用不能完全代替指针(如前序遍历链式二叉树需要递归更改指针的值,也就是地址引用显然不适合

引用做函数返回值

请注意,当引用做返回值时,地址必须在静态区,如全局变量,动态内存,否则会出现野引用的错误。

野引用:

        显然,这是一段很狗屎的代码,引用ret1和ret2的地址为函数tmp中的一个地址,函数结束后,该内存中的值销毁,故ret1和ret2在tmp外查看时为一个随机值,且它们俩地址是一样的,幸亏引用的特性让他们不行被修改,不然他们和野指针的效果是一样的。

引用的底层实现原理

让我们写出这样一段代码。

int main()
{
	int x = 10;
	int& y = x;

	int m = 10;
	int* n = &m;

	system("pause");
	return 0;
}

然后转到反汇编

有十分甚至九分的相似

引用和指针,在底层其实是一样的

同理,引用也会消耗内存来存储地址,只是这块内存找不到罢了。


一些吐槽

        不知道大家在阅读一些比较老的c语言数据结构书籍时有没有遇到这样的一段代码(应该在双向链表部分),它会给这么一段cpp的代码(请注意看它新建文件时给的后缀

//这是一个双向链表
typedef struct Node {
	struct Node* next;
	struct Node* prev;
	int val;
}LNode,*PNode;
void PushBack(PNode& pnode, int val)
{
	;//布拉布拉
}

按照原本c语言的逻辑:因为在PushBack函数中需要递归更改原链表的指针的值,需要向函数中一个二级指针,也就是*PNode。但是,或许是书的作者觉得指针不好理解,就给了一个c++的引用,这属实时有点离谱。


感谢观看!!! 

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

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

相关文章

【3.6数据库系统】数据库备份与恢复技术

目录 1.数据备份1.1备份方式1.2备份类型 2.数据库故障与恢复 1.数据备份 1.1备份方式 △冷备份也称为静态备份,别是将数据库正常关闭,在停止状态下,将数据库的文件全部备份(复制)下来。 △热备份也称为动态备份,是利用备份软件&a…

E7数据库备份和恢复

E7数据库备份和恢复 一、实验目的 在Mysql上,学习如何备份数据库和恢复的各种方法。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存; 2、软件要求:Mysql; 3、时间:1小时; 4、撰写实验报告并按时提交。 三、…

常用MQ产品的对比

常用MQ产品的对比 本文整理了常用MQ之间的对比,旨在帮助大家在实际项目中选择MQ产品。 消息队列对比参照表 注: 对照表来自:消息队列对比参照表 ,对比维度比较全面,结果个人比较认同,强烈建议参考。 Rock…

【OCC学习23】使用Draw探索OCC API 【完结】

对于OCC应用开发者来说,OCC的文档虽然不错,但针对具体的需求找到合适的API还是得不断摸索。我发现看Draw的代码是探索OCC API使用的最佳路径。掌握根据Draw命令查找对应代码就能高效找到解决方案。所以这是本系列的最后一篇分享了,个人感觉OC…

TarGAN:多模态医学图像转换GAN

TarGAN 核心思想网络结构 核心思想 论文:https://arxiv.org/abs/2105.08993 代码:https://github.com/2165998/TarGAN 解决的问题:传统多模态医学图像转换通常,在生成高质量图像方面存在问题,特别是在关键目标区域或…

nginx安装ssl模块http_ssl_module

查看nginx安装的模块 /usr/local/nginx/sbin/nginx -V若出现“–with-http_ssl_module”说明已经安装过,否则继续执行下列步骤 进入nginx源文件目录 cd /usr/local/nginx/nginx-1.20.2重新编译nginx ./configure --with-http_ssl_module如果组件linux缺少&…

利用Burp Suite观察https通联

对使用 HTTPS 协议的应用程序进行测试时,常使用 bp 观察流量,为能成功建立HTTPS联接,在将bp设置居代理的同时,还必须导入bp伪证书,这样才能修改请求和响应,加密和解密流量,成功模拟浏览的各种动…

Web3创业:去中心化初创公司的崛起

随着Web3时代的到来,去中心化技术的崛起不仅令人瞩目,也为创业者带来了前所未有的机遇。在这个新的时代,一批去中心化初创公司正崭露头角,重新定义着商业和创新的边界。本文将深入探讨Web3创业的趋势,以及去中心化初创…

Your lDE is missing natures to properly support your projects

错误提示 Your lDE is missing natures to properly support your projects. Some extensions on the Eclipse Marketplace can be installed to support those natures.解决方案 打开项目文件,找到.project 文件,用编辑器打开 找到 把下图效果图中相关…

自然语言处理-文本标注

文本标注 现在让我们考虑词元级任务,比如文本标注(text tagging),其中每个词元都被分配了一个标签。在文本标注任务中,词性标注为每个单词分配词性标记(例如,形容词和限定词)。 根据…

【iOS ARKit】人脸追踪之挂载虚拟元素

人脸跟踪(Face Tracking)是指将人脸检测扩展到视频序列,跟踪同一张人脸在视频序列中的位置。是论上讲,任何出现在视频中的人险都可以被跟踪,也即是说,在连续视频帧中检测到的人脸可以被识别为同一个人。人脸…

单片机面向对象思维的架构:时间轮片法

今天分享一篇单片机程序框架的文章。 程序架构重要性 很多人尤其是初学者在写代码的时候往往都是想一点写一点,最开始没有一个整体的规划,导致后面代码越写越乱,bug不断。 最终代码跑起来看似没有问题(有可能也真的没有问题),但…

vue3创建多种遥感底图的网页教程

创建一个能调用多种遥感底图的网页教程 简介 大家好,我是锐多宝。 最近我正在使用vue3,这里记录一下我是如何使用vue3调用多种遥感底图。当然,如果你觉得安装vue麻烦,也可以直接使用原生的JavaScript,方法大同小异。…

机器学习:多元线性回归闭式解(Python)

import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化数据"""self.theta None # 训练权重系…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新:正常刷新网页,网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新:忽略缓存刷新,重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

哪些 3D 建模软件值得推荐?

云端地球是一款免费的在线实景三维建模软件,不需要复杂的技巧,只要需要手机,多拍几张照片,就可以得到完整的三维模型! 无论是大场景倾斜摄影测量还是小场景、小物体建模,都可以通过云端地球将二维数据向三…

MTP与管理壳(AAS)有异曲同工之妙

在过去的几年中,流程工业中的不同部门(例如制药、精细化学品以及食品和饮料部门)遇到了一系列共同且可比较的新兴挑战。这些挑战包括: 新产品的需求迅速接连不断,更快交货和更低价格的压力,更多定制产品&a…

【wvp】关于码率等的相关流程设计

目录 流程设计 前端UI大致设计 终端上的相关修改界面参考 流程设计 前端UI大致设计 终端上的相关修改界面参考

【WPF.NET开发】WPF中的双向功能

本文内容 FlowDirectionFlowDocumentSpan 元素非文本元素的 FlowDirection数字替换 与其他任何开发平台不同,WPF 具有许多支持双向内容快速开发的功能,例如,同一文档中混合了从左到右和从右到左的数据。 同时,WPF 也为需要双向功…

文件IO讲解

💕"跑起来就有意义"💕 作者:Mylvzi 文章主要内容:文件IO讲解 一.与文件相关的基本概念 1.什么是文件 文件从广义上来说就是操作系统对其所持有的硬件设备和软件资源的抽象化表示,但是在日常生活中我们所提到的文件就…