C++初阶语法——引用,从此和指针说byebye

news2024/11/27 17:40:16

前言:相信学过C语言的同学肯定被指针深深折磨过,从一级指针到二级指针,数组指针,函数指针等等,可谓是谈针色变。而在C++中,使用引用代替了指针的使用,大大降低了我们学习的难度。

引用

  • 一.什么是引用
  • 二.引用的特性(限制)
  • 三.传引用传参(引用做参数)
  • 四.传引用返回(引用做返回值)
    • 1.传值返回(与传引用返回对比)
    • 2.传引用返回
    • 3.传引用返回示例
  • 五.引用权限问题

一.什么是引用

引用并不是新定义了一个变量,而是给已经存在的变量取了个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
以孙悟空为例,他又叫做齐天大圣,斗战胜佛,所以我们说齐天大圣就能想到孙悟空。
格式:类型& 引用变量名 = 引用实体

可以看到,a和b的地址是一样的。在这里插入图片描述#

二.引用的特性(限制)

1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体,就不能再引用其它实体(这点与指针略有不同,因为指针是可以改变指向的对象的)

void test()
{
	int a = 10;
	int b = 20;
	//int& ra;  //编译出错,引用在定义时必须初始化
	int& ra = a;
	int& rra = a;  //ra,rra都是a的别名,地址是一样的。
	//int& ra = b;  //ra已经是a的别名,不能再作为其它变量的别名。
}

三.传引用传参(引用做参数)

我们知道C语言中用函数交换两个变量需要传址调用,而在C++中可以直接用引用替代,方便理解的同时也不需要在进行解引用,这在存在二级及以上指针的时候极大地提高了代码的可读性。

//C语言写法
//void Swap(int* a, int* b)
//{
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}

//引用C++写法
void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 10;
	int b = 20;
	Swap(a, b);
	cout << "a = " << a << endl;   // 20
	cout << "b = " << b << endl;   // 10
	return 0;
}

四.传引用返回(引用做返回值)

这是一个重点内容,在后续学习默认成员函数时会经常出现。
先说结论:如果函数返回时,出了函数作用域,如果返回对象还在,则可以使用引用返回,否则必须使用传值返回。

1.传值返回(与传引用返回对比)

请看这段代码,你觉得打印ret会显示什么? 答:1
函数栈帧销毁,在使用传值返回时会使用临时变量存储n,临时变量具有常属性

这里是引用

2.传引用返回

问:打印ret会显示什么?
传引用返回,返回的是n的别名,但是函数栈帧已经销毁了,因此这时候ret有两种情况,随机值或者是1,这取决于这块栈帧空间是否被重置。(博主在VS上运行结果是1)
这里是引用

3.传引用返回示例

使用传引用返回可以简化操作,如下例代码,原本顺序表的查找和修改两个接口通过传引用返回可以直接合并成一个接口

typedef struct Seqlist {
	int* a;
	int capacity;
	int size;
}SL;
//C接口设计
//返回第i个位置的值
int SLFind(SL* Seq, int i)
{
	assert(i < Seq->size);
	//...
	return Seq->a[i];
}
//修改第i个位置的值
void SLModify(SL* Seq, int i,int x)
{
	assert(i < Seq->size);
	//...
	Seq->a[i] = x;
}

//C++接口设计
int& SLFM(SL* Seq, int i)
{
	assert(i < Seq->size);
	//...
	return Seq->a[i];
}
int main()
{
	SL* s1;
	//SLFind(s1,2) = 10  // 不可行,因为传值返回的值具有常属性,不能被修改。
	SLFM(s1, 2) = 10; //将第2个位置的值修改成10
	return 0;
}

五.引用权限问题

对于具有常属性的变量等需要注意:在使用引用时,权限可以缩小,平移,但是不能放大。

int main()
{
	const int a = 10;
	int ar = a;  //这是单纯的赋值,不存在权限问题。
	//int& b = a;  //权限放大,原本a具有常属性,但是别名b没有,将a的权限放大了。
	const int& c = a; // 权限平移,a,c都具有常属性
	int x = 20;
	const int& d = x;  //权限缩小,别名d具有常属性,而引用实体x没有,将x的权限缩小了。
	return 0;
}

拓展:

以下代码你知道错在哪里吗?
在这里插入图片描述
或许有读者会认为是类型不匹配,实则不然:这里的错误是权限放大,加上const就不会标红了。
在这里插入图片描述
原因:x是int类型,而i是double类型,会发生类型转换,将x给给一个double类型的临时变量,而临时变量具有常属性,因此如果不加const就会发生权限放大。

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能动动你们发财的小手给点点赞和关注.
在这里插入图片描述

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

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

相关文章

阿里云二级域名配置

阿里云二级域名配置 首先需要进入阿里云控制台的域名管理 1.选择域名点击解析 2.添加记录 3.选择A类型 4.主机记录设置【可以aa.bb或者aa.bb.cc】 到时候会变成&#xff1a;aa.bb.***.com 5.解析请求来源设置为默认 6.记录值 设置为要解析的服务器的ip地址 7.TTL 默认即…

知网行政部门主管_《天津教育》投稿指南

知网行政部门主管_《天津教育》投稿指南 一、《天津教育》期刊简介&#xff1a; 主管单位&#xff1a;天津市教育委员会 主办单位&#xff1a;天津教育报刊社 国际标准刊号ISSN:0493-2099 国内统一刊号CN:12-1044/G4 邮发代号6-9 出版周期&#xff1a;旬刊 出版地&…

Linux usb设备固定端口号

Linux usb设备固定端口号 一:/sys/bus/usb/devices/二:设备信息三:固定usb设备名方法 一:/sys/bus/usb/devices/ 信息显示如下 1-0:1.0 1&#xff1a;表示 1 号总线&#xff0c;或者说 1 号 Root Hub0&#xff1a;表示端口号1&#xff1a;表示配置号0&#xff1a;表示接口号命…

【FeatureBooster】Boosting Feature Descriptors with a Lightweight Neural Network

这篇论文介绍了一种轻量级网络&#xff0c;用于改进同一图像中关键点的特征描述符。该网络以原始描述符和关键点的几何属性作为输入&#xff0c;使用基于多层感知器&#xff08;MLP&#xff09;的自我增强阶段和基于Transformer的交叉增强阶段来增强描述符。增强后的描述符可以…

搭建Repo服务器

1 安装repo 参考&#xff1a;清华大学开源软件镜像站:Git Repo 镜像使用帮助 2 创建manifest仓库 2.1 创建仓库 git init --bare manifest.git2.2 创建default.xml文件 default.xml文件内容&#xff1a; <?xml version"1.0" encoding"UTF-8" ?…

java之junit Test

JUnit测试简介 1.什么是单元测试 单元测试是针对最小的功能单元编写测试代码Java程序最小的功能单元是方法单元测试就是针对单个Java方法的测试 2.测试驱动开发 3.单元测试的好处 确保单个方法运行正常如果修改了方法代码&#xff0c;只需确保其对应的单元测试通过测试代码…

QtCreator5.15.2新建工程没有pro文件

Qt系列文章目录 文章目录 Qt系列文章目录前言一、解决办法参考 前言 最近新安装了Qt5.15.2版本&#xff0c;使用她创建新工程发现居然没有pro工程文件&#xff0c;取而代之的是CMakeLists.txt&#xff0c;文件里面的代码几乎看不懂&#xff0c;不知道如何在CMakeLists.txt加入…

CentOS虚拟机 NAT模式连网

1、查看本地VMnet8的网络信息 cmd ipconfig2、编辑VMware虚拟网络编辑器 &#xff08;1&#xff09;打开网络编辑器 &#xff08;2&#xff09;打开NET设置 &#xff08;3&#xff09;修改网络配置 修改子网ip和windows查到的ip的最后一位不一样就行和子网掩码照抄 3、在VMw…

P1993 小 K 的农场(差分约束)(内附封面)

小 K 的农场 题目描述 小 K 在 MC 里面建立很多很多的农场&#xff0c;总共 n n n 个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得一些含糊的信息&#xff08;共 m m m 个&#xff09;&#xff0c;以下列三种形式描述&#xff1a;…

SRV6 BE

实验目的:通过SRV6 BE实现CE之间的ipv4网络互访 步骤1&#xff1a;配置ISP网络设备的ipv6地址 步骤2&#xff1a;配置ISP网络的IGP协议&#xff08;ISIS ipv6&#xff09;设备配置前先在每台设备上面 undo dcn PE1: isis 1cost-style widenetwork-entity 49.0001.0000.0000…

Substack 如何在去中心化内容创作领域掀起波澜

面对数字内容广告化的困境&#xff0c;Substack回归做内容的初心&#xff0c;通过产品和平台双轮驱动&#xff0c;重塑一个去中心化的多元文化内容聚集地&#xff0c;实现了增长突破。其核心策略在于先使用简洁的创作工具赋能内容生产&#xff0c;进而通过平台的互动机制促进用…

【Python基础教程】super()函数的正确使用方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 1.super(本身类名,self).方法名(参数)这样就可以调用父类的方法和参数了,super()内也可不加参数 2.规律是super是按调用的次序执行&#xff0c;super后面的语句是逆向执行的。 有2段示例代码&#xff0c;不同的在于value有没…

高忆管理:股票成交量怎么看?

股票成交量是衡量股票商场生意活泼度的重要目标之一。通过调查股票成交量的巨细和改变趋势&#xff0c;能够帮助出资者更好地了解商场状况和出资方向&#xff0c;从而做出更正确的出资决策。那么&#xff0c;股票成交量怎么看&#xff1f;本文将从多个视点为您剖析。 一、股票成…

ZyjDataLink 全量MySQL同步程序 - 开发过程 01

开发过程由本人从 架构设计 到 代码实现 独立完成&#xff0c;通过该博客记录分享开发经验 ZyjDataLink 当前的目标是做到 MySQL大数据量的快速同步&#xff0c;后期希望扩展的功能 高度可操作性&#xff0c;融入增量数据库同步&#xff0c;跨数据库同步 ZyjDataLink 需求分析…

python数据分析报告 范文,python数据分析报告+代码

大家好&#xff0c;本文将围绕python数据分析期末大作业报告展开说明&#xff0c;python数据分析期末大作业是一个很多人都想弄明白的事情&#xff0c;想搞清楚python数据分析报告怎么写需要先了解以下几个事情。 背景 虽然用Python开发爬虫脚本&#xff0c;顺利把某房产网站的…

小学生作业随机加减乘除运算计算习题答案 html源码

小学生作业随机加减乘除运算计算习题答案 html源码 这道题目提供了多种选项,包括运算符和输入的运算数范围。题目数量也可以选择。如果你选择好了选项,就可以点击出题按钮进行练习。 为了方便,题目答案可以打印出来。但是,如果隐藏了横线,就会去除等号后面的下划线。推荐使用…

Java中实现图片和Base64的互相转化

文章目录 前言一、代码二、测试三、结果 前言 公司项目中用到了实名认证此&#xff0c;采用的第三方平台。后端中用到的单项功能为身份证信息人像对比功能&#xff0c;在写demo的过程中发现&#xff0c;它们所要求的图片信息为base64编码格式。 一、代码 package com.bajiao…

QGIS二次开发二:不重新编译QGIS进行二次开发

目录 一、下载OSGeo4W 二、配置VS 三、测试代码 四、补充&#xff1a;配置QT插件 五、导出项目为模板 六、Release模式的一个问题解决 由于重新编译QGIS对于初学者来说还是有一定难度&#xff0c;因此这里介绍另外一种不编译QGIS也能够二次开发的方法&#xff0c;不需要…

世界算力简史(上)

1946年2月14日&#xff0c;在美国宾夕法尼亚州东南部的费城&#xff0c;人们正在像以往一样正常工作和生活。 忽然&#xff0c;他们发现&#xff0c;房间里的灯暗了下来。 刚刚经历过二战的人们&#xff0c;对这种情况习以为常。他们心想&#xff1a;“是不是哪里的电力线路又坏…

骑行,自由和安全,哪个第一?

自行车运动&#xff0c;绿色自由&#xff0c;但安全为本。 自由&#xff0c;对于自行车运动来说&#xff0c;是骑行的初衷和核心。它不仅代表着一种无拘无束的出行方式&#xff0c;更是一种生活态度&#xff0c;一种挑战自我&#xff0c;追求极致的精神。就像鱼儿需要海洋&…