C++之引用(详解,引用与指针的区别)

目录

1. 引⽤的概念和定义

2. 引⽤的特性

3. 引⽤的使⽤

4. const引⽤

5. 指针和引⽤的关系


1. 引⽤的概念和定义

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名(相当于是给变量起了个外号),编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋⻛";林冲,外号豹⼦头;
类型& 引⽤别名 = 引⽤对象;
这⾥引⽤也和取地址使⽤了同⼀个符号&,⼤家注意使⽤⽅法⻆度区分就可以。
#include<iostream>
using namespace std;int main()
{int a = 0;// 引⽤:b和c是a的别名int& b = a;int& c = a;// 也可以给别名b取别名,d相当于还是a的别名int& d = b;++d;// 这⾥取地址我们看到是⼀样的cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;return 0;
}

运行结果:

可见a,b,c,d的地址打印出来是一样的。

2. 引⽤的特性

引⽤在定义时必须初始化
⼀个变量可以有多个引⽤
引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体,不能改变引用的指向。

#include<iostream>
using namespace std;int main()
{int a = 10;int& b = a;int c = 20;// 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向,// 这⾥是⼀个赋值b = c;cout << &a << endl;cout << &b << endl;cout << &c << endl;return 0;
}

结果是a与b的地址是一样的,且与c不同。

3. 引⽤的使⽤

引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。
引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
引⽤返回值的场景相对⽐较复杂,我们在这⾥不展开介绍。
引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。
⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但对于没有学过c++的同学来说是雪上加霜了。

4. const引⽤

可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访
问权限在引⽤过程中可以缩⼩,但是不能放⼤
不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。
所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,
C++中把这个未命名对象叫做临时对象
#include<iostream>
using namespace std;
int main()
{int a = 10;//可读可写const int& ra = a;//可读不可写,权限缩小return 0;
}
#include<iostream>
using namespace std;
int main()
{const int a = 10;//可读不可写int& ra = a;//可读可写,权限放大,报错return 0;
}

#include<iostream>
using namespace std;
int main()
{int a = 1;int b = 1;const int& c = 10;//常量只能用const来修饰,不可更改const int& d = a + b;//在这里d只能用const来修饰,因为a+b后会产生临时变量,//临时变量具有常属性,也相当于常量return 0;
}
#include<iostream>
using namespace std;
int main()
{double a = 0.1;int& b = a;//会报错return 0;
}

但是用const来修饰就是对的

#include<iostream>
using namespace std;
int main()
{double a = 0.1;const int& b = a;//正确return 0;
}

在这里a会发生隐式类型转换,从double类型转换为int类型,中间会将转换后的数据存在临时变量中(具有常性),因此要用const来修饰。

5. 指针和引⽤的关系

C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。
#include<iostream>
using namespace std;
int main()
{int* ptr = NULL;int& rptr = *ptr;return 0;
}

上面的代码看着很奇怪,但是我们只要理解了引用的底层是指针就迎刃而解了,这其实就是指针之间的赋值,但是我们平时就是认为引用没有开辟空间,就是起别名。

下面就是可能产生野引用的情况,在调用func函数结束后栈帧被销毁,p就是野引用了。

#include<iostream>
using namespace std;
int& func()
{int a = 10;return a;
}int main()
{int& p = func();return 0;
}

****************************************感谢观看,欢迎评论区指正************************************

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

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

相关文章

九、【Python】基础 -【Python函数与类全解析】:掌握模块化编程的艺术

&#x1f4a1;&#x1f4da;【Python函数与类全解析】&#xff1a;掌握模块化编程的艺术&#x1f4da;&#x1f4a1; 在Python中&#xff0c;函数和类是构建可重用代码和组织程序逻辑的重要工具。下面我将分别介绍它们的基本使用方法&#xff0c;并提供一些具体的用例。 一、函…

视频平台麓战奥运经济,谁能接住这“破天的富贵”?

文丨郭梦仪 与巴黎奥运会炸裂开幕式的“松弛感”不同&#xff0c;赛场外的流量之争早已硝烟弥漫。 今年&#xff0c;腾讯、咪咕、快手、抖音与中央广播电视总台达成奥运转播版权合作&#xff0c;长短视频平台各占一半。 而今&#xff0c;获得转播权的视频平台们&#xff0c;…

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.2信息安全系统

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

哈希(模拟实现unordered系列容器)

目录 哈希表源代码哈希表模板参数的控制哈希表区分set与map的不同模板参数哈希节点定义的模板参数修改 提供仿函数&#xff0c;获取T类型数据当中的键值unordered_map的仿函数unordered_set的仿函数哈希表的模板参数增加 string类型无法取模问题哈希表的模板参数增加 哈希表默认…

探索天穹数仓自治能力的新实践

探索天穹数仓自治能力的新实践 随着业务和技术的发展&#xff0c;传统数仓模式向数智数仓模式演进&#xff0c;数据治理面临诸多挑战。自治平台采用双引擎策略&#xff0c;注重感知能力、观测能力、诊断能力和优化能力的建设&#xff0c;实现了对数据的精细化管理。例如&#x…

这本vue3编译原理开源电子书,初中级前端竟然都能看懂

前言 众所周知vue提供了很多黑魔法&#xff0c;比如单文件组件(SFC)、指令、宏函数、css scoped等。这些都是vue提供的开箱即用的功能&#xff0c;大家平时用这些黑魔法的时候有没有疑惑过一些疑问呢。 我们每天写的vue代码一般都是写在*.vue文件中&#xff0c;但是浏览器却只…

JavaSE面向对象进阶

static 介绍 static表示静态&#xff0c;是Java中的一个修饰符可以修饰成员方法、成员变量 被static修饰的成员变量&#xff0c;叫做静态变量被static修饰的成员方法&#xff0c;叫做静态方法 静态变量 特点&#xff1a;被该类所有对象共享 调用方式&#xff1a; 类名调用&am…

聚芯前行|美格智能亮相2024 ChinaJoy骁龙主题馆,展现数字娱乐的无限可能

7月26日&#xff0c;2024中国国际数码互动娱乐展览会&#xff08;ChinaJoy&#xff09;在上海新国际博览中心正式拉开帷幕。美格智能携手高通公司亮相骁龙主题馆&#xff0c;以5G-A毫米波MiFi解决方案及高算力AI模组&#xff0c;共同为广大玩家和粉丝打造了一个前沿技术赋能、充…

27-《木芙蓉》

木芙蓉 木芙蓉&#xff08;Hibiscus mutabilis Linn.&#xff09;又名芙蓉花、拒霜花、木莲、地芙蓉、华木&#xff0c;原产中国。其喜温暖、湿润环境&#xff0c;不耐寒&#xff0c;忌干旱&#xff0c;耐水湿。对土壤要求不高&#xff0c;瘠薄土地亦可生长。为锦葵科、木槿属落…

校园气象站

TH-XQ3校园气象站是一个用于测量和记录气象数据的设备&#xff0c;可以帮助学生和教师更好地了解校园的气候情况。以下是校园气象站的使用方法&#xff1a; 安装&#xff1a;校园气象站通常需要安装在一个开阔的区域&#xff0c;远离建筑物和树木等遮挡物。确保气象站稳固地安装…

中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题

HaoWa v1.3.1由挖主题开发的一款网址导航类主题。 HaoWA主题除主体导航列表外&#xff0c;对主题所需的小模块都进行了开放式的HTML编辑器形式的功能配置&#xff0c;同时预留出默认的代码结构&#xff0c;方便大家在现有的代码结构上进行功能调整。 同时加入了字体图标Font …

Bus Number

https://codeforces.com/problemset/problem/991/E 假想一下&#xff0c;如果我们知道m序列的长度是不是可以计算数量 这个好算&#xff0c;但是好像多了一点数&#xff0c;因为不能有前导零&#xff0c;所以我们要减去有前导零的部分 最后得到 那么我们只需要枚举数量即可&am…

【C#】 使用GDI+获取两个多边形区域相交、非相交区域

一、使用GDI获取两个多边形区域相交、非相交区域 在 C# 中使用 GDI&#xff08;Graphics Device Interface Plus&#xff09;处理图形时&#xff0c;你可以使用 System.Drawing 和 System.Drawing.Drawing2D 命名空间中的类来操作区域&#xff08;Region&#xff09;。下面是一…

Spark累加器(Accumulator)

1.累加器类型&#xff1a; 数值累加器&#xff1a;用于计算总和、计数等。布尔累加器&#xff1a;用于计算满足特定条件的次数。自定义累加器&#xff1a;允许定义复杂的聚合逻辑和数据结构。集合累加器&#xff1a;用于计算唯一元素的数量&#xff0c;处理去重操作。 在 Spar…

Study--Oracle-07-ASM常用操作(五)

一、向磁盘组添加磁盘 1、查看系统中可用的磁盘 set lines 150; col name for a35; col path for a35; select group_number,path, state, name, total_mb, free_mb from v$asm_disk; 2、磁盘组操作 创建磁盘组 create DISKGROUP DATADGV2 EXTERNAL REDUNDANCY DISK /dev/…

解决Qt3D程序场景中无法显示创建的立体图形?

有的新手在创建Qt3D程序时&#xff0c;因为不熟练&#xff0c;导致经常遇到无法显示3D图形的情况。 原因其实也简单&#xff0c;就是设置的摄像机的位置不对&#xff0c;或者压根没有设置摄像机。 // CameraQt3DRender::QCamera *cameraEntity view.camera();cameraEntity-&g…

Java二十三种设计模式-外观模式(9/23)

外观模式&#xff1a;简化复杂系统的统一接口 引言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。外观模式定义了一个可以与复杂子系统交互的简化接口&#xff0c;使得子系统更加易于使用…

Android 10.0 Launcher3仿ios的folder文件夹widget功能实现二

1.前言 在10.0的系统ROM开发中,在进行一些系统Launcher3定制功能开发中,需要实现folder文件夹widget的功能,由于launcher3 默认不支持folder跨行显示,所以就需要借助自定义的widget小部件功能来实现相关功能,接下来分析实现相关功能 2.Launcher3仿ios的folder文件夹widge…

jQuery前端网页制作

1、Jquery的概述 1.1JavaScript库 JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常很困难也很耗时。 为了应对这些调整,许多的 JavaScript (helper) 库应运而生。 这些 JavaScript 库常被称为 JavaScript 框架。 市面上一些广受欢迎的 JavaScript 框架:…

大厂linux面试题攻略五之数据库管理

一、数据库管理-MySQL语句 0.MySQL基本语句&#xff1a; 1.SQL语句-增 创建xxx用户&#xff1a; mysql>create user xxx % indentified by 123456; xxx表示用户名 %b表示该用户用来连接数据库的方式&#xff08;远程或本地连接&#xff09; indentified by 123456设置密码…