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
HDMI2.1 FRL流控 概览 HDMI 2.1 FRL的流控本质是。 阅读详情

相关推荐

双目视觉入门实战:用Matlab标定相机,再到Python OpenCV完成测距的完整链路

本文详细介绍了双目视觉技术的完整实现流程,从Matlab相机标定到Python OpenCV测距的全链路实践。重点解析了Matlab与OpenCV的参数转换技巧,以及立体校正、视差计算等关键步骤的代码实现,帮助开发者快速掌握双目测距系统的搭建方法。

weixin_29166013的博客 445

【c++】cpp之引用

c++中引用知识点

hutaotaotao的博客 1328

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1640

CPP的引用

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

qq_61273847的博客 1556

R语言笔记十:独立性检验函数

1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作

weixin_44384631的博客 4111

【鸿蒙南向开发】OpenHarmony音频驱动audio适配方案

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_666的博客 4510

cpp——引用

引用是什么?

weixin_57525369的博客 3345

高速PCB差分对布线仿真实战案例

差分对布线是高速PCB设计的关键环节,直接影响信号完整性与EMI性能。本文结合实际项目,详解等长控制、阻抗匹配、间距优化等核心技巧,并通过仿真工具验证眼图、串扰和时序裕量,助力工程师规避常见高速pcb设计陷阱。

weixin_29092787的博客 349

CPP引用

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

qq_59805046的博客 838

黑猫带你学eMMC协议第22篇:emmc可靠写详解(Write Reliability)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有部分错误请留言。 本文部分内容可能源自网络,侵删。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、什么是可靠性写属性(Write Reliability)? 2、可靠写和普通的写有什么区别? 3、设置可靠写的流程及流程框图。 4、可靠写需要遵循哪些规则? 1.3 参考链接 本文主要参考链接:http://www.up48.com/cn/support/8_37.html 2 什么

黑猫奥利奥的博客 3120

2026 AI Agent Harness Engineering 生态报告:开源工具链的现状与未来趋势

IEEE P2863-2025《通用人工智能自主代理技术架构与评估规范》于2025年11月正式发布,将AI Agent(通用人工智能自主代理)定义为:一种具备感知(Perception)、记忆(Memory)、推理(Reasoning)、规划(Planning)、行动(Action)五大核心能力闭环,能够在无显式指令覆盖全部环节的前提下,自主完成特定领域或开放领域复杂任务的智能实体。

AI 算法实战派 496

引用 CPP

引用

huiohuoi的博客 1047

Ego Planner规划算法(上)——Ego Planner流程介绍

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 1万+

cpp中对于引用的使用

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

Lyajpunov的博客 951

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

2401_87555420的博客 444

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【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、付费专栏及课程。

余额充值