C++中的引用

一、引用的概念

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

注意,由于C++兼容C,所以&既可以是引用符号,也可以是取地址

int a = 0;
int& b = a;cout << &a << endl;//0000009D826FF524
cout << &b << endl;//0000009D826FF524

补充:

1.同一个变量可以有多个别名

2.可以对变量的别名再取别名

3.引用必须初始化

4.引用不能该别指向

二、引用的基本使用场景

1.做函数参数

void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}int main()
{int x = 10;int y = 20;swap(x, y);//函数接收到x与y后,相当于为x与y分别取别名为a和bcout << "x=" << x << " " << "y=" << y << endl;return 0;
}

2.做函数返回值

注意:不能返回局部变量(临时变量)的引用,否则可能会出现野引用

局部变量a在func函数执行完毕后即被销毁,主函数中用引用变量ret接收变量a,因此ret为野引用

int& func()
{int a = 10;return a;
}
int main()
{int& ret = func();//ret即为野引用return 0;
}

正确做法:返回静态变量,诸如此类的非临时变量的引用

int& func()
{static int a = 10;return a;
}
int main()
{int& ret = func();return 0;
}

三、引用和指针的区别

语法方面:

1.引用是取别名,无需开空间;指针是地址,需要开空间

2.引用必须初始化;指针可以初始化,也可以不初始化

3.引用不可以改变指向;指针可以改变指向

4.引用相对较安全,没有空引用,不易出现野引用;指针容易出现空指针和野引用

5.sizeof(引用)结果是引用指变量的大小;sizeof(指针)结果是4/8字节

底层实现方面:

汇编层面上,不存在引用,引用就是使用指针实现的,引用编译后也就成了指针

引用的本质是指针常量:int& b=a   即为 int* const b=&a

四、常量引用

1.常量引用,引用变量不可修改,即a不可再修改

void func(const int& a)
{cout << a << endl;
}

2.普通引用只能指向变量,常量引用可以指向常量,编译器会临时创建一个变量

const int &ret=10;//正确,const修饰后,编译器会临时创建一个变量//int tmp=10;//int &ret=tmp; 

3.引用作为函数参数时,常量引用和普通引用是不一样的,可以构成重载函数

void func(int &a)
{cout<<"func(int &a)的调用"<<endl;
}void func(const int &a)
{cout<<"func(const int &a)的调用"<<endl;
}
int main(int argc, char** argv) {int m;func(m);//调用func(int &a) func(3);//调用func(const int &a) 
}

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

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

相关文章

微信小程序(八)图片的设定

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.图片的三种常见缩放形式 2.图片全屏预览 源码&#xff1a; testImg.wxml <!-- 默认状态&#xff0c;不保证缩放比&#xff0c;完全拉伸填满容器 --> <image class"pic" mode"scaleTo…

​分享最新五十首养生音乐,养五脏,解抑郁,去烦恼【附养生音乐下载地址+最佳聆听时间)】

​分享最新五十首养生音乐,养五脏,解抑郁,去烦恼【附养生音乐下载地址最佳聆听时间&#xff09;】 在中国医学巨作《黄帝内经》中记载&#xff1a; 肝属木&#xff0c;在音为角&#xff0c;在志为怒&#xff1b; 心属火&#xff0c;在音为徴&#xff0c;在志为喜&#xff1b; …

STM32单片机学习5--STM32中断

文章目录 一、前言二、NVIC中断控制器2.1、NVIC结构体成员2.2、抢占优先级和响应优先级2.3、NVIC的优先级组 三、EXTI外部中断四、中断实战4.1、确定连线4.2、配置中断控制端口4.3、配置中断端口4.4、配置中断服务函数4.5、主函数调用 一、前言 单片机无系统执行逻辑&#xff…

Java面试题(4)

14.说一下HashMap的实现原理 HashMap概述&#xff1a;HashMap是基于哈希表的Map接口的非同步实现&#xff0c;以键值对的存储形式存在&#xff0c;且线程 不安全。此实现提供所有可选的映射操作&#xff0c;并允许使用空键值对&#xff0c;但并不保证映射的顺序&#xff0c;尤…

关于使用jdk8自带的日期类getDayOfWeek()的详细解释

问题引入 我们会发现getDayOfWeek()这个函数和其他自带函数不一样 直接写会报错 但是如果我们将他变成getDayOfWeek().getValue() 又能够正常运行,我们这次就来看看是为什么 解释 进入getDayOfWeek()源码查看 我们进入getDayOfWeek()的源码中查看 我们可以发现他给我们返回的…

vivado:关联notepad++

网上好多都要下插件&#xff0c;看了野火视频&#xff0c;直接在vivado里面加路径弄好的 2 3&#xff08;那个fonts and colors也经常用 改字体&#xff09; 4 5 以下是我的路径 D:/gongjuruanjian/notepad/Notepad/notepad.exe [file name] -n[line number] 把[file name] -…

上位机图像处理和嵌入式模块部署(自定义算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们在使用opencv的时候&#xff0c;虽然大部分算法都不需要我们自己重头开始编写&#xff0c;但是总有一些关于我们自己产品的know-how&#xff0…

控制项目风险

一、风险预算 暴雪公司经理艾莉森&#xff0c;暴雪公司是一家小型工业企业&#xff0c;该公司的高管为了降低生产成本&#xff0c;决定搬迁工厂。项目经理明白实际情况与初始计划之间常常会有很大的出入。项目经理需要事先为一些事情做好准备&#xff0c;并在项目运作或预算方面…

python报错:TypeError: ‘str‘ object is not callable

错误打印&#xff1a; python 代码&#xff1a; datalist [];datadictTmp (};mch 48;for i in range(1,10):datadict.clear()mch 48 ## 报错位置 datadict[parent_ID] str(i)chr(mch)mch 1datadict[paymentMethod] str(i)chr(mch)mch 1datadict[payer] str(i)chr(mc…

kafka入门(八):kafka分区分配策略

kafka分区分配策略 参数&#xff1a; Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。 默认情况下&#xff0c;此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor&#xff0c;即采用RangeAssignor分配策略…

【服务器】安装宝塔面板

目录 &#x1f33a;【前言】 &#x1f33c;【前提】连接服务器 &#x1f337;方式一 使用工具登录服务器如Xshell &#x1f337;方式二 阿里云直接连接 &#x1f33c; 1. 安装宝塔 &#x1f337;获取安装脚本 方式一 使用下面提供的脚本安装 方式二 使用官网提供的脚本…

notepad++ v8.5.3 安装插件,安装失败怎么处理?下载进度为0怎么处理?

notepad v8.5.3 安装插件&#xff0c;安装失败&#xff1f;下载进度为0&#xff0c;怎么处理&#xff1f; 安装 进度 进度条没有进度 &#xff0c;然后就退出了&#xff0c;自动打开程序&#xff0c;不知道什么问题&#xff0c;插件管理下面也没有插件显示 找到问题了&#x…

2024年最全春节攻略,外贸人看这一篇就够了

凡事预则立&#xff0c;不预则废--《礼记•中庸》 不知不觉春节将至&#xff0c;很多外贸公司以及工厂也都公布了放假时间&#xff0c;虽然放假时间有长有短。很多人应该都有点迫不及待想要快点放假&#xff0c;回家过春节。春节毕竟是我们每年最重大的节日&#xff0c;也是家…

梯度下降算法实现原理

文章目录 什么是梯度梯度下降算法(通过迭代解决目标函数最小值)代码实现拓展: 什么是梯度 在了解梯度之前,我们先了解一下导数: 用于描述曲线变换快慢的一个量,在几何意义上表示为函数的斜率,数学定义为: f ′ ( x ) lim ⁡ △ x → 0 f ( x △ x ) − f ( x ) △ x f(x) \…

【Python进阶编程】python编程高手常用的设计模式(持续更新中)

Python编程高手通常熟练运用各种设计模式&#xff0c;这些设计模式有助于提高代码的可维护性、可扩展性和重用性。 以下是一些Python编程高手常用的设计模式&#xff1a; 1.单例模式&#xff08;Singleton Pattern&#xff09; 确保一个类只有一个实例&#xff0c;并提供全局…

Taro框架如何抹平各端的差异

Taro 是一款开源的跨端统一开发框架&#xff0c;它通过以下方式来抹平各端&#xff08;如微信小程序、支付宝小程序、H5、React Native 等&#xff09;的差异&#xff1a; 统一的编程模型&#xff1a;Taro 提供了与 React 类似的编程模型&#xff0c;开发者可以使用 JSX 语法和…

幻兽帕鲁服务器搭建,包教包会

服务器搭建 幻兽帕鲁服务器搭建&#xff0c;包教包会&#xff0c;不会评论区评论手把手帮忙搭建 一、steamCMD安装 1、安装screen&#xff1a; yum install screen -y 2、切换用户&#xff1a; su -ls /bin/bash steam 3、切换至steam用户目录&#xff1a; cd ~ 4、下载ste…

CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑

tip: 超链接对应的文案通常被称为“锚文本”&#xff08;anchor text&#xff09; 在继承CrawlSpider父类的前提下&#xff0c;编写一个 fetch_referer 方法获取当前response.url的父链接和锚文本。 实现逻辑&#xff0c;通过一个例子简要说明&#xff1a; 如果设置 start_…

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 订单金额满多少,一次性订单金额满多少,充值多少升级

“订单金额满多少”或“一次性订单金额满多少”进行升级的商业逻辑。这种策略通常是为了激励用户增加消费额度、提高客单价或者提升用户的活跃度与忠诚度&#xff0c;具有以下好处&#xff1a; 刺激消费增长&#xff1a;商家设置一定的门槛&#xff0c;如一次性订单金额满300元…

C++基础语法和用法

文章目录 1.hello world2.引入namespace(命名空间/域问题)3.输入输出4.缺省参数/默认参数5.函数重载6.引用7.内联函数8.auto关键字&#xff0c;基于范围的for循环&#xff0c;空指针NULL8.1 auto8.2 基于范围的for循环8.3 nullptr 1.hello world #include <iostream> us…