【C++】引用

目录

​编辑

1.引用概念

2.引用特性

2.1一个变量可以取多个别名,别名还可以取别名 

2.2一个别名不可以对应多个变量。

​编辑2.3 别名的地址一样:

2.4引用必须初始化,必须有个引用实体

2.5 引用不能改变指向

3 .引用的价值和意义

3.1.做参数 

3.2引用做参数可以提高效率

3. 3.引用做返回值

3.4 可以使用引用返回的场景:

3.5 引用做返回值提高效率 

3.6  引用做返回值可以修改返回对象

4.常引用

5.引用和指针的区别


1.引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。简单说引用就是取别名,比如孙悟空,齐天大圣、弼马温、猴子、美猴王都是说的孙悟空一样。

可以使用:& 来为变量取别名,,别名也是指定原来的变量只是名字不一样,可以理解为对一块空白命名为不同的名字:

类型& 引用变量名(对象名) = 引用实体;

int  a = 10;
int& x = a;

int main()
{int a = 1;int b = a;int& c = a;b++;printf("%d ", a);printf("\n");c++;printf("%d ", a);printf("%d ", b);printf("%d ", c);return 0;
}

2.引用特性

2.1一个变量可以取多个别名,别名还可以取别名 

2.2一个别名不可以对应多个变量。

(铜锣湾只能有一个浩南)

2.3 别名的地址一样:

2.4引用必须初始化,必须有个引用实体

int&b

2.5 引用不能改变指向

引用可以代替指针吗?

不用指针就用引用,java没有指针只有引用,但是是不可以的,c++的应用有些不一样,取别名但是别名的指向不能改变。

所以不能代替指针,比如链表中增删节点都要改变指针指向的对象也就是那个指针指向的地址,引用无法改变指向的对象所以没有办法完全代替指针。

 

3 .引用的价值和意义

3.1.做参数 

C语言中交换两个变量,需要传指针:

void Swap(int* left, int* right)
{int temp = *left;*left = *right;*right = temp;
}
int main()
{int a = 0, b = 20;Swap(&a, &b);
}
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
int main()
{int a = 0, b = 20;Swap(&a, &b);Swap(a, b);
}

left是a的别名 right是b的别名,在链表中传二级指针的时候可以使用别名就更为简单

看一下这段教科书代码:

typedef struct SListNode
{struct SListNode* next;int val;
}SLTNode,*PSLTNode;//类型是
//第一个是将struct SListNode 重定义为 SLTNode,节点的重定义
//第一个是将 struct SListNOde * 重定义为 PSLTNode,节点指针的重定义void SListPushBack(PSLTNode& phead, int x)//phead是plist的别名
{if (phead == NULL){}else{}}
int main()
{PSLTNode s1 = NULL;SListPushBack(s1, 2);return 0;
}

3.2引用做参数可以提高效率

#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{TestRefAndValue();return 0;
}

3. 3.引用做返回值

函数调用结束过后,count函数空间销毁,将n的值交给eap(寄存器)带回到ret,所以返回的不是n是n的值的拷贝。 如果要返回的值比较大,寄存器存不下的时候,就会找一块空间将这个值保存下来,这块空间不受count函数空间销毁的影响,看编译器的机制。

如果我们使用引用返回会发生什么呢?

也就是说上面的传值返回返回的是n的值的拷贝,我们使用别名作为返回值,是想返回n,

结果是不确定的,结果取决于栈帧销毁时对这块空间清理还是不清理。如果清理了就是随机值,如果不清理就是原来的值。

说明vs下没有清理,但是其他编译器就不确定了。

 

出了作用域,返回对象就销毁了,不能引用返回,否则结果不确定 

3.4 可以使用引用返回的场景:

static 修饰的全局变量 malloc上申请的变量,空间在静态区,不会销毁。

 

局部的静态全变量只初始化一次。,后面就不会执行初始化这个语句,所以分开写就会执行了。

3.5 引用做返回值提高效率 

#include <time.h>
struct A { int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a; }
// 引用返回
A& TestFunc2() { return a; }
void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc1();size_t end1 = clock();// 以引用作为函数的返回值类型size_t begin2 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc2();size_t end2 = clock();// 计算两个函数运算完成之后的时间cout << "TestFunc1 time:" << end1 - begin1 << endl;cout << "TestFunc2 time:" << end2 - begin2 << endl;
}int main()
{TestReturnByRefOrValue();return 0;
}

3.6  引用做返回值可以修改返回对象

#include<assert.h>
typedef struct SL
{int size;int* a;
}SL;int& SLat(SL* ps, int pos)
{assert(ps);assert(pos < ps->size);return ps->a[pos];
}
int main()
{SL s;SLat(&s, 3) = 10;return 0;
}

引用:做参数,做返回值,指针也可以达到,形参修改改变形参。

4.常引用

int main()
{const int a = 0;int& b = a;return 0;
}

a不可修改,但是b可以修改,说不过去出现了权限的放大,取别名只能平移权限不能放大权限

int main()
{const int a = 0;/*int& b = a;*/const int& b = a;return 0;
}

权限不可以放大但是可以缩小

int c = 10;
const int& d = c;

常量也可以取别名

const int& e = 10;

不加const就不可以,常数是常量

int i = 1;
double j = i;//隐式类型转换
double& rj = i;//不可以
//类型转换中间都会产生一个临时变量,临时变量具有常属性
const double& rj = i;//可以

 类型转换中间都会产生一个临时变量,临时变量具有常属性

这里并不是x变成无符号整型跟y比
而是生成一个临时变量,这个变量是无符号整型的x的值,再更y比

int *ptr = (int *) i;

i的类型不会变,变的是生成的临时变量。 

类型转换发生在:类型提升,类型截断

int i= 10000;

char ch = i;(发生截断),截断的也是中间生成的临时变量,临时变量具有常属性。

5.引用和指针的区别

在语法概念上来说,引用就是一个别名,没有独立空间,和引用实体共用一块空间。

但是在底层是有单独开空间的,底层引用的实现和指针是一样的。

引用方式:

指针方式:

 日常学习,我们将引用认为并没有开空间,以语法概念为准:

指针还是指针类型,引用还是原来类型。

总结来说;

  • 引用概念上定义一个变量的别名,指针存储一个变量地址。
  •  引用在定义时必须初始化,指针没有要求
  • 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
  • 没有NULL引用,但有NULL指针
  • 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
  • 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  • 有多级指针,但是没有多级引用
  • 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  •  引用比指针使用起来相对更安全  

以上就是今天关于c++引用的内容,后续更详细的要到类中再为大家讲解,大家可以先点一下关注。 

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

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

相关文章

关于 QSound播放wav音频文件,播放失败“using null output device, none available” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/137264493 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

【简单讲解下epoll】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

LabVIEW深度学习

目录 一、配置环境1.1、显卡选择1.2、下载显卡驱动1.3、下载并安装Anaconda1.4、配置Anaconda软件包下载服务器1.5、配置虚拟环境tf_gpu1.6、安装vscode1.7、安装tensorflow1.8、下载安装Git1.9、安装TensorFlow Object Detection API框架1.10、安装依赖的python软件包1.11、配…

包子凑数【蓝桥杯】/完全背包

包子凑数 完全背包 完全背包问题和01背包的区别就是&#xff0c;完全背包问题每一个物品能取无限次。 思路&#xff1a;当n个数的最大公约数不为1&#xff0c;即不互质时&#xff0c;有无限多个凑不出来的&#xff0c;即n个数都可以表示成kn&#xff0c;k为常数且不为1。当n个…

Vue关键知识点

watch侦听器 Vue.js 中的侦听器&#xff08;Watcher&#xff09;是 Vue提供的一种响应式系统的核心机制之一。 监听数据的变化&#xff0c;并在数据发生变化时执行相应的回调函数。 目的:数据变化能够自动更新到视图中 原理&#xff1a; Vue 的侦听器通过观察对象的属性&#…

Redis实战篇-集群环境下的并发问题

实战篇Redis 3.7 集群环境下的并发问题 通过加锁可以解决在单机情况下的一人一单安全问题&#xff0c;但是在集群模式下就不行了。 1、我们将服务启动两份&#xff0c;端口分别为8081和8082&#xff1a; 2、然后修改nginx的conf目录下的nginx.conf文件&#xff0c;配置反向代…

蓝桥杯杯赛之深度优先搜索优化《1.分成互质组》 《 2.小猫爬山》【dfs】【深度搜索剪枝优化】【搜索顺序】

文章目录 思想例题1. 分成互质组题目链接题目描述【解法一】【解法二】 2. 小猫爬山题目链接题目描述输入样例&#xff1a;输出样例&#xff1a;【思路】【WA代码】【AC代码】 思想 本质为两种搜索顺序&#xff1a; 枚举当前元素可以放入哪一组枚举每一组可以放入哪些元素 操…

天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器

在电力行业中&#xff0c;输电线路的安全稳定运行对于保障社会经济活动至关重要。然而&#xff0c;广阔的输电线路常常穿越复杂的地形和恶劣的自然环境&#xff0c;给电力巡检和保护工作带来了巨大挑战。 为了提高巡检效率和响应速度&#xff0c;更好地保障电力设施的安全运行…

鸿蒙OS元服务开发:【(Stage模型)学习窗口沉浸式能力】

一、体验窗口沉浸式能力说明 在看视频、玩游戏等场景下&#xff0c;用户往往希望隐藏状态栏、导航栏等不必要的系统窗口&#xff0c;从而获得更佳的沉浸式体验。此时可以借助窗口沉浸式能力&#xff08;窗口沉浸式能力都是针对应用主窗口而言的&#xff09;&#xff0c;达到预…

聚能共创下一代智能终端操作系统 软通动力荣膺“OpenHarmony优秀贡献单位”

近日&#xff0c;由开放原子开源基金会指导&#xff0c;以“开源共享未来”为主题的OpenHarmony社区年会在北京成功举办。本次活动汇集OpenHarmony项目群共建单位及生态伙伴等多方力量&#xff0c;旨在对2023年度OpenHarmony年度开源事业全面总结的同时&#xff0c;吸引更多伙伴…

HFSS仿真环形耦合器学习笔记

HFSS仿真环形耦合器学习笔记 文章目录 HFSS仿真环形耦合器学习笔记1、 理论基础2、 设计分析3、 仿真验证1、 求解器设置2、 建模3、 激励方式设置4、 边界条件设置5、 扫频设置6、 设计检查&#xff0c;仿真分析7、 数据后处理 1、 理论基础 环形定向耦合器的结构示意图如图所…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

【JAVASE】带你了解面向对象三大特性之一(继承)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.继承 1.1 为什么需要继承 Java 中使用类对现实世界中实体来…

基于SpringBoot Vue超市管理系统

一、&#x1f4dd;功能介绍 基于SpringBoot Vue超市管理系统 角色&#xff1a;管理员、员工 管理员&#xff1a;管理员登录进入超市管理系统的实现可以查看首页、个人中心、员工管理、商品类型管理、商品信息管理、商品进货管理、商品出库管理、商品销量管理、销售退回管理等…

Jettison 1.8.7直装版 外部磁盘辅助弹出

Jettison 是一款适用于 macOS 的实用工具&#xff0c;旨在简化外部驱动器的管理。它可以自动卸载和重新挂载外部驱动器&#xff0c;帮助您更方便地使用和保护您的存储设备。 软件下载&#xff1a;Jettison 1.8.7直装版下载 自动卸载和重新挂载&#xff1a;Jettison 可以在您离开…

ideaSSM 校园兼职招聘平台bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 校园兼职招聘平台是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

phpstorm设置头部注释和自定义注释内容

先说设置位置&#xff1a; PhpStorm中文件、类、函数等注释的设置在&#xff1a;setting-》Editor-》FIle and Code Template-》Includes-》PHP Function Doc Comment下设置即可&#xff0c;其中方法的默认是这样的&#xff1a; /** ${PARAM_DOC} #if (${TYPE_HINT} ! "…

蓝牙学习九(定向广播 ADV_DIRECT_IND)

一、简介 广播类型有如下&#xff1a; 非定向可连接广播&#xff08;ADV_IND&#xff09;。可连接的非定向广播&#xff0c;表示当前设备可以接受任何设备的连接请求。 定向可连接广播&#xff08;ADV_DIRECT_IND&#xff09;。可连接的定向广播&#xff0c;设备不能被主动扫描…

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储&#xff0c;通过vtkDataObject进行可视化数据的表达&#xff0c;在vtkDataObject内部有一个vtkFieldData的实例&#xff0c;负责对数据的表达&#xff1a; vtkFieldData存储数据的属性数据&#xff0c;该数据是对拓扑结构和几何结构信息的…

Unity自定义框架(1)-----------单例模式

前言&#xff1a; Unity作为一款强大的游戏开发引擎&#xff0c;其基础框架的设计对于项目的结构和性能有着重要的影响。其中&#xff0c;单例模式是一种常用的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 什么是单例模式&#xff1f…