c++之引用

C++引用 类型 &引用名 = 引用实体(变量名);。引用在定义时必须进行初始化,并且一旦初始化后,就会一直引用该变量,不能再引用其他变量。// 定义一个引用 ref,它是 num 的别名// 通过引用修改原始变量的值ref = 20;return 0;在上述代码中,ref是num的引用,对ref的操作实际上就是对num的操作。注意引用类型必须和引用实体是同种类型的。对于基本数据类型(如intdouble等),传值和传引用的效率差异通常不大。 阅读详情

概念:

引用是给变量另外去一个别名,就类似于一个人有大名也有小名一样,别名不会另外开辟空间,和原来的变量名共用一块内存空间

使用方法:

类型&引用变量名=引用实体

int main()
{
	int a = 10;
	int& b = a;
	cout << a << endl << b << endl;
	cout << &a << endl << &b << endl;
	return 0;
}

b是a的别名,当打印a和b的地址时,是同一个地址 

注意:1.引用的类型必须和引用实体类型一致

           2.引用在定义时必须初始化,是谁的别名

           3.一个变量可以用多个引用,像a的别名可以时b,也可以是c等等

           4.引用一旦引用了一个实体,就不能在引用其他实体

int a=10;
int c=20;
int&b=a;
b=c;

这里就很好的解释了第四条注意事项,当引用了一个实体后不能在引用其他实体,b=c,b是a的别名,a和b都变成了20,这里不是把b变成c的引用

常引用:

int main()
{
	int a = 10;
	const int& b = a;
	b = 20;
	const int c = 10;
	int& d = c;
	return 0;
}

1.当实体没有被const修饰时,引用被const修饰时,b=20会编译错误

2.当实体被const修饰时,引用没有被const修饰时,int&d=c会编译错误

总结:这是权限的缩小还是放大问题,实体可读可改,那引用就无所谓,当实体只能读不能改时(也就是被const修饰,只能读这个变量,不能修改里面的值)那引用只有加上const才行,不然实体只能读,而我可以通过别名去修改就说不过去了,这也就是权限的放大,权限缩小是可以的,也就是当一个实体可读可改,别名只能读,这是被允许的

int main()
{
	int a = 10;
	int& b = a;
	double& c = a;
	const double& d = a;

}

这里除了第三条都可以编译过去,第三条违反的原则是引用的实体必须和引用类型一样

第二条很明显也能编译过去,第四条在这里需要重点注意

需要明确的一点是,临时变量具有常性,这里会先生成一个临时变量,10变成10.0(类型转换,int->double)然后在d在绑定到这个临时变量身上,因为是const才可以绑定,临时变量具有常性,没有const修饰就不合法,输出是10,因为cout默认省略掉后面的0

可以通过cout<<&d和&a明显看出不是同一个地址

 使用场景:

1.做参数(有点类似于指针)

void swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	cout << a << endl;
	cout << b << endl;
	return 0;
}

这里a和b是别名,形参是实参的别名

2.做返回值

int test1()
{
  static int n=0;
  n++;
  return n;
}
int& test2()
{static int n=0;
  n++;
  rteturn n;
}

在test1中是平时使用的函数返回,值返回,这里会创建一个临时变量,类型是int,然后在给外面,假设临时变量叫temp,这句话就相当于int temp=n;创建一个临时变量,要开空间,这个临时对象会在函数返回时生成,并且在调用者使用完返回值之后被销毁。

在test2中使用引用返回,避免了创建临时变量,不会开临时空间,就类似int&temp=n;

int&r1=test1();
int&r2=test2();

第一个不允许,也就是违背了常引用里的第四条,因为传值返回会创建一个临时变量,r1没有const修饰,所以第一个编译不过去

第二个没有创建临时变量,没有开辟空间,是允许的。

那为什么函数体内要有static修饰呢?

无论函数传值返回还是参数传值,都会拷贝,传引用就不会,就会返回n,但引用返回时,必须指向一个函数调用结束后仍然有效的对象,也就是static修饰的变量,被放在了静态区,否则出了函数n被销毁了,那int&temp=n;会指向一个被销毁的对象,会导致未定义行为,这也间接的说明了引用返回不安全,得谨慎使用

引用和指针的区别:

1.引用在定义时必须初始化,指针没有要求int*p=NULL;

2.引用在引用一个实体后不能改变,指针可以随时指向别的实体(变量)

3.sizeof不同,引用是看引用实体的类型,指针是看32位还是64位机器

4.有多级指针int*,int**,没有多级引用

总结:

引用可以提高传参时的效率,避免创建临时空间,效率高。但实际使用场景得谨慎

引用的底层逻辑是使用指针实现。

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

相关推荐

Python异步协程爬虫优化:解决aiohttp中ServerDisconnectedError的高效策略

本文深入探讨了在Python异步协程爬虫中使用aiohttp时,如何高效解决常见的ServerDisconnectedError问题。核心策略包括全局复用ClientSession、精细配置TCPConnector连接池、实施请求重试与速率限制,从而构建稳定、高效的异步爬虫架构,有效避免服务器断开连接错误。

pz890123的博客 859

【c++】cpp之引用

c++中引用知识点

hutaotaotao的博客 1328

Android Framework之Pkms详解

system 用户并没有访问应用程序目录的权限,但是 Installd 服务是以 root 用户启动的,可以访问 /data/data/ 下的目录,Installd 需要完成一些创建应用数据的任务。Installer 服务是 Android 提供的用于安装的服务,Installer 持有 Installd 守护进程对应的 Binder 服务的代理对象,本质上是通过 Binder 通信调用底层的 Installd 服务真正完成 APK 文件格式的优化和转换、建立相关的数据目录、删除文件、安装应用等工作。

门徒07的博客 1842

CPP的引用

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

qq_61273847的博客 1556

基于STM32的智能停车场管理系统

随着城市车辆数量激增,传统停车场管理效率低下。本文设计了一款基于STM32的智能停车场管理系统,支持车牌识别、车位引导、自动计费等功能,可显著提升停车场运营效率。系统适用于商场、小区等场景,支持多终端协同管理。本系统实现了停车场智能化管理,显著提升了运营效率。:STM32F746(高性能Cortex-M7)问题讨论,stm32的资料领取可以私信!:OV7725摄像头(30fps):ESP32(Wi-Fi+蓝牙)红外对射传感器(车辆进出检测)支持蓝牌、黄牌、新能源车牌。⬇帮大家整理了单片机的资料。

stm32d1219的博客 878

raw_count、tpm、fpkm、rpkm如何选择

转录组测序中常见的数据类型有:raw_count、tpm、fpkm、rpkm。本文进行简单辨析: 一、概念 1 raw_count RNA-seq数据中,raw_count一般是指mapped到基因外显子区域的reads数目。比如说htseq,STAR,或者RSEM等NGS分析流程计算产生的counts值。其中RSEM(RNA-Seq by Expectation-Maximization),考虑到一条read 可能会匹配多个exon位置,故而其产生的为expected_count。 2 TPM

weixin_59289660的博客 1万+

cpp——引用

引用是什么?

weixin_57525369的博客 3345

使用 Cynthion 与 Packetry 进行 USB 抓包与协议分析

Cynthion 是 Great Scott Gadgets 推出的USB 流量分析与注入设备。它具备以下特点:通过 FPGA 实现高速 USB 流量捕获;能够同时作为 USB Host 和 Device,进行调试和测试;支持输出 pcap 文件,可直接用 Wireshark 分析;提供 Python API,方便与上层软件联动。简单来说,Cynthion 是一个USB 协议分析仪 + 注入工具。硬件层捕获:实时拦截 USB 总线上的数据包;软件层解析。

YIMUleizi的博客 1264

CPP引用

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

qq_59805046的博客 839

手把手教你用Python模拟侧信道攻击:从电磁辐射到数据窃取(附防御代码)

本文详细介绍了如何使用Python模拟侧信道攻击,从电磁辐射信号采集到数据窃取的全过程,并提供了实用的防御代码。通过实战案例,帮助安全研究员和开发者理解侧信道攻击原理,掌握信号处理与图像重建技术,同时学习有效的噪声干扰和电磁屏蔽防御措施。

weixin_28716443的博客 161

【AI面试】 Python 的装饰器

Python装饰器是一种高阶函数,用于在不修改原函数代码的情况下增强其功能。它通过@语法糖接收目标函数作为参数,并返回一个包含额外逻辑(如日志、缓存、权限验证等)的新函数。装饰器的核心价值在于代码复用和解耦,符合开闭原则,典型应用包括性能分析、权限控制等场景。例如,@timer_decorator可自动为函数添加耗时统计功能。本质上,@decorator等价于func = decorator(func),实际调用的是装饰器返回的包装函数。进阶技巧包括使用@functools.wraps保留原函数元信息。装饰

钱多多先森 184

引用 CPP

引用

huiohuoi的博客 1048

Python 爬虫实战:华尔街见闻精选文章爬取(反反爬 + 投资情绪分析)

Python 爬虫实战:华尔街见闻精选文章爬取(反反爬 + 投资情绪分析)

yansideyucsdn的博客 970

cpp中对于引用的使用

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

Lyajpunov的博客 951

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

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

2401_87555420的博客 445

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

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

【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°的博客 1036

【C++】引用

【C++】引用

weixin_60478154的博客 2238
上一篇: c++之函数重载
下一篇: c++之内联函数
Fcw0551
博客等级 码龄2年 330粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值