C++引用

Cpp 11 / 万能引用、引用折叠和完美转发 一、万能引用 1、英文:Universal Reference 。 2、诞生的原因 因为 C++ 中存在左值引用和右值引用,导致若想同时实现既可传入左值又可传入右值的功能,需要对相同函数进行重载,导致代码冗余。 3、解决办法 为了解决上述问题,就诞生了万能引用,具体用法如下: template<typename T> void func(T&& param) { ; } 主要实现方法是依靠 C++ 强大的模板推导能力,在编译期间确定 param 是左值. 阅读详情

 

1. 引用基本概念及说明

引用就是为已有的对象a所起的另外一个名字b,可以通过引用去修改b以实现对象a的修改。

引用格式:类型说明符 &引用名=变量名

例程:

int i;
int &ri=i;
i=5;
cout<<i<<endl;
ri=10;
cout<<ri<<endl;

 

&不是C语言中的取地址运算,而是标识符

 

类型说明符必须和目标变量类型一致

说明:

引用在声明时必须初始化

 

一个实体可以有多个引用,但是一个引用只能引用一个实体

引用即别名,相当于目标对象有一个原名和别名,引用不是对象,所以也无法作为另外一个引用的原名。

 

不能建立数组的引用

2. 引用的实际应用

2.1 引用作为参数

        还记得在C语言中,如果要对函数传入可以在函数内部修改,且修改有效的变量时,我们需要使用传入指针。而C++中,引用提供了传入可修改变量的一种方法,见例子

//p1,p2均为引用
void swap(int& p1, int& p2)
{
    int p;
    p = p1;
    p1 = p2;
    p2 = p;
}

int main()
{
    int a = 1, b = 2;
    cout << "交换前,a和b" << " " << a << " and " << b << endl;
    swap(a, b);
    cout << "交换后,a和b" << " " << a << " and " << b << endl;
}

输出:

 

从上述例子我们可以看出:

1

传递引用给函数和传递指针的效果是一样的

2

参数传递较大时,用引用比一般变量传递参数更好。原因是因为引用传递,内存中不产生实参的副本,其直接对实参操作;

使用一般变量传递时,需要复制实参产生副本,有空间消耗

3

引用相比于指针更容易使用,更清楚。指针效果与引用一样,甚至引用底层就是用指针实现,但是指针对象传入时,同样要分配空间;函数中需要使用解引用符(*)来运算,容易错误且代码阅读性较大;此外,调用函数时要使用变量地址来作为实参。 

           基于以上原因,在很多C++工程的源代码中,我们可以看到引用使用得远比指针传参频繁。 

 

      2.2 常引用:不能通过引用对目标进行修改,使得引用的目标成为常量,实现引用的安全性

          常引用声明方式:const 类型标识符 &引用名=目标变量名。

    例子:

     int i;
     const int &ri=i;
     ri=1;   //错误,无法通过常量引用修改目标实体i
     i=1;   //正确

      常引用更多使用在引用作为函数参数中,使得在函数内部无法修改传入参数,以实现代码的安全性。

 

     2.3 引用作为返回值,好处:内存中不产生返回值的副本

声明方式:类型标识符 &函数名(形参列表)

                {函数体}

这部分在此不做解释,可进一步查看参考2。

 

3. 引用总结

引用解决的问题:

过大数据或对象的传递,以减少空间消耗(不产生copy,提高效率);通过const使用,提高引用传递安全性;

引用与指针的

主要区别:

指针通过指针变量指向一个对象,通过地址对对象进行操作,会产生空间消耗。引用是对象的别名,对引用操作就是对对象操作,不产生空间消耗。同时,引用的代码可读性比指针更好.

什么时候

使用引用?

流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。      

 

参考:

  1. 《C++ Primer》2.3节 复合类型, 2.4节 const 限定符
  2. 引用介绍及用法:https://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html
  3. 指针详解:https://blog.youkuaiyun.com/weixin_39640298/article/details/84900326
  4. 指针与引用的区别:https://blog.youkuaiyun.com/smartgps2008/article/details/90648015                                                                                           https://blog.youkuaiyun.com/Sun_Life_/article/details/89304963
项目经理必看:如何建立高效的相关方沟通机制? 你是否遇到过这样的场景?客户突然说“这不是我要的”,开发团队抱怨“需求总变”,高层追问“进度滞后为什么不早说”?这些问题的根源往往是——相关方沟通机制失效。本文聚焦“如何建立高效沟通机制”,覆盖从识别相关方到持续优化的全流程,适用于IT、产品、工程等各类项目。本文将按“理解问题→拆解核心概念→掌握工具方法→实战落地→未来趋势”的逻辑展开,重点讲解“相关方分析矩阵”“沟通计划表”等实用工具,并用“组织生日派对”的案例贯穿全文,让抽象概念变得可感知。相关方识别:用“权力/利益矩阵”找对人(像派对邀请关键客人) 阅读详情

相关推荐

HDMI设计2----EDID and E-EDID

1,EDID是什么?有什么用? 图1 应用场景 如图1所示的应用场景,PC将视频信号发送 到我们的设备上,经过一系列的传输和切换,设备将视频信号发送到显示器或者投影机上,也就是说,我们的设备位于PC和显示器之间。首先,在输入端,设备需要让PC知道自己是能够接受输入视频信号的,让PC认为自己是一台显示器。如果不这样做的话,PC可能会拒绝输出任何视频信号的(VGA接口不需要EDID也能输出)。除此之外,设备还要告诉PC自己支持的显示时序。而在输出端,当设备需要自建输出时序而不是简单的复制...

Archar_Saber的博客 7988

【c++】cpp之引用

c++中引用知识点

hutaotaotao的博客 1328

【智能车学习】电磁循迹中的基本控制算法

今天心血来潮,突然想总结一下电磁车的一些基本算法,也希望可以给新手同学们一点帮助和参考。本篇主要讲述智能车电磁循迹中涉及到的基本算法,包括滤波算法,归一化算法,PID控制等

Carry_qing的博客 6万+

CPP的引用

CPP的引用,欢迎点赞,互相关照。为了梦想前进。

qq_61273847的博客 1556

卸载重装Ubuntu22.04双系统

先说一下写此篇文章的背景吧,我在Windows下配置了三个cornerNet深度学习环境分别是cuda10.3(显卡版本太高不支持),cuda11.3(配置后偶然看到一篇说这个版本win下只能用CPU跑),最后是cuda11.1终究还是没能跑通代码,因为它的代码是在Liunx系统写的,就想着装个Ubuntu试试看,在网上看说一般软件不要装太高版本,我就下载了470版的显卡驱动,跟着步骤升级了系统内核,结果第二天开机Ubuntu就崩了,开机黑屏左上角只有一道横杠显示,只能按ctrl+shift+f5进入命令窗

编程小白的博客 8106

FPGA与GPU异构计算:重塑嵌入式AI的算力边界与场景定义

本文深入探讨了FPGA与GPU异构计算如何突破嵌入式AI的算力瓶颈。通过分析工业视觉、智能交通及航天等场景,阐述了FPGA负责高速数据采集与预处理,GPU专注复杂AI推理的协同模式,有效解决了传统单一架构在算力、功耗、接口和实时性上的挑战,为嵌入式AI应用提供了高效能解决方案。

spice的博客 486

cpp——引用

引用是什么?

weixin_57525369的博客 3345

手把手拆解固态电池成本:2030年真能比液态电池便宜30%吗?

本文深度解析固态电池成本结构,探讨2030年实现比液态电池便宜30%的可行性路径。通过拆解正极材料、负极材料和固态电解质的成本演变,分析关键技术对降本的影响,并预测产业链协同效应下的成本优化趋势。文章指出,在材料创新、设备国产化和政策支持等多重因素推动下,固态电池有望在2030年实现显著降本目标。

kite3的博客 401

CPP引用

通过 const 关键字定义常量引用,必须在声明时初始化。上述代码中,10 是一个字面值常量,本身不是变量,不能直接被引用。此时,如果想要修改 a 的值,是不被允许的。会提示表达式必须是可修改的左值。a = 100;常量引用主要用来修饰形参,提高安全性,防止形参改变实参。如下代码,向 test () 函数传入实参变量 a,test () 函数执行之后,输出 a 的值是 100。也就是说函数执行完成后,会对外部的变量 a 产生影响。int a = 10;这里ref是对a的常量引用。

qq_59805046的博客 838

Windows2008使用-解决漏洞-CVE-2010-2730

随着硬件的升级,操作系统也逐渐进行了版本更新。目前阶段,Windows2016Server、Windows2022Server逐渐成为了以Windows系列的服务器平台系统。对于有些应用而言,由于其业务的固定,可能仍只能运行在Windows2008Server或者Windows2012Server上。有时候我们为安全需要,需要将相关的操作系统涉及的漏洞做修复。最近碰到在一个Windows2008R2 的操作系统漏洞CVE-2010-2730,一顿操作,终于找到了合适的方案,这里分享给大家。

mystonelxj的博客 2314

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

weixin_43567873的博客 1983

引用 CPP

引用

huiohuoi的博客 1047

工业视觉降本300%实战:C# + 开源YOLO如何干掉Halcon/VisionPro?

在当前制造业普遍追求“降本增效”的大背景下,工业视觉检测系统作为产线的眼睛,其成本问题日益突出。通过该方案,我们成功帮助一家电子厂将单条产线的视觉检测成本从15万降低至不足5千(主要为工控机硬件成本),降本幅度超过95%,且系统稳定性经受住了6个月连续生产的考验。:C#负责“工程化”和“业务逻辑”,YOLO负责“智能算法”,二者结合,完美覆盖了工业视觉从算法到落地的全链路。的组合,构建一套高性能、低成本、易维护的工业视觉解决方案,并彻底替代昂贵的付费库。” 这是一个典型的误区。工业相机/USB相机。

2601_94871597的博客 428

cpp中对于引用的使用

C++新增了一种复合类型——引用变量。引用是已定义的变量的别名(另一个名称)。例如,如果将twain作为clement变量的引用,则可以交替使用twain和 clement 来表示该变量。那么,这种别名有何作用呢?是否能帮助那些不知道如何选择变量名的人呢?有可能,但引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。这样除指针之外,引用也为函数处理大型结构提供了一种非常方便的途径,同时对于设计类来说,引用也是必不可少的。

Lyajpunov的博客 951

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++中引用与指针的区别_cpp 引用与指针的区别

学过C的朋友应该都知道指针,刚开始学习指针的时候,都会觉得指针很难,学完了指针才发现指针就是保存的地址。引用没有分配内存空间,所以访问函数形参就是访问引用的变量,是直接访问。而指针分配了内存空间用来保存变量的地址,需要通过保存的地址找到指向的变量,是间接访问。而指针在传参的时候,必须传变量的地址过去,否则不能改变变量的值。5、sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。6、引用访问一个变量是直接访问,而指针访问一个变量是间接访问。二、引用与指针的区别。

2401_87555420的博客 444

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++中在一个cpp文件中引用另外一个cpp文件的方法

创建1个func2.cpp 通过include 引入func1.cpp 来使用func1里面的方法(如果有单独的头文件,比如func1.h 可以通过#include“func1.h”)C++中在一个cpp文件中引用另外一个cpp文件 可以通过导入cpp文件或者.h文件来实现,类似python中的import 导入。

小牧在一直在学习,在前进的道路上大家一起学习,进步。 8008

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Cpp】指针与引用

在C语言中,我们对指针的规范并不严谨——我们常常会用void*来传入一个不知道其变量类型的指针,为了兼容CCpp允许这样的语法存在,但是,由于这样的指针不具有安全性,我们无法通过来解引用void*,这就需要用到我们的显式转换。为了方便看指针的引用而不是由一堆组成了参数和参数类型,我们采用引用来让这种写法变得更加简洁;

Mongxin_Chan的博客 1121

c++中一个cpp文件中的类如何引用另一个cpp文件中的类成员变量及方法

A.cpp中引用B.cpp文件中的类BB的成员变量以及方法: 在B.cpp文件中定义一个全局指针 BB *b_ptr; 然后在A.cpp中 声明这个全局指针 extern BB *b_ptr; 就可以使用了! ...

Stephen 1万+

Cpp_引用

1.引用即别名int a = 10; int& b = a; // b引用了a,b是a的别名,b就是a,a就是b /* int b = a; */引用必须做初始化,而且一经初始化其所引用的目标就不能更换。引用对临时变量(匿名对象的作用)任何出现字面值常量、计算表达式、类型转换、函数返回值的场合,都会有临时变量(匿名变量)产生。只能用带有常属性(const)的引用引用这样的临时变量,而且一旦通过引用引

Jerry的专栏 2787

【Cpp】引用的本质

一、什么是引用 引用是C++中的一个新的语言特性,从表面来说,引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明如下: 类型标识符 &引用名 = 目标变量名; 这里面的&不是位运算、不是取地址,而是一个引用的标识符,可以认为是一个“类型标识符 &”类型,类型标识符是指目标变量的类型。如: int a = 10; int &b = ...

baymaxly的博客 843

Cpp中的各种引用

引用不能引用数组 引用大小测试 class MyClass { char & a; cha

weixin_43572257的博客 1366

[cpp][引用][重点][cpp初阶][一][8]详细讲解

const引用是指对常量的引用。在C++中,使用const关键字来修饰引用,它可以引用一个常量对象 or 一个不能被修改的对象主要用于函数参数传递和保护数据不被意外修改。

2301_80443197的博客 845

cpp引用

cpp引用的小笔记

wjcyaya的博客 382

cpp类的引用

引用 引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名;   引用说明:   (1)&在此不是求地址运算,而是起标识作用。   (2)类型标识符是指目标变量的类型。   (3)声明引用时,必须同时对其进行初始化。   (4)引用声明完毕后,相当于目标变量名有两个名称,即该目

weixin_54025765的博客 746

Cpp::C++11右值引用与移动构造(30)

继续!正文开始!暂时就到这里吧,因为笔者写到这里的时候下课了!总之!1.左值引用:直接引用对象以减少拷贝2.右值引用:间接减少拷贝,将 临时资源 等 将亡值 的资源通过移动构造进行转移,减少拷贝。

tan180°的博客 1035

【C++】引用

【C++】引用

weixin_60478154的博客 2237
上一篇: GMS匹配算法论文、源码笔记
下一篇: 从 UNIX 到 GitHub:十个关于自由和开源软件历史的重要事件
半子yuan
博客等级 码龄11年 27粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值