C++ 引用传递 超级详细 小白也行

一. 引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。(本名和小名共用一块地址

例如:就像是给你取小名,本名小名都是你,所有作用也都一样。

  类型& 引用变量名(对象名) = 引用实体(如图下)

注1:千万不要把这个理解成取地址符号,和取地址符号完全不一样。引用的&放在类型名(int)后面,而取地址的&是放在变量前面(例如图中的&a)。

注2:引用类型必须和引用实体是同种类型的。

ps:数组引用和数组指针一样要记得打括号,不然会报错,还有记得写上个数,个数不同也不能引用。

二.引用特性

1. 引用在定义时必须初始化(否则运行报错)

2. 一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体

显然这是改变了值,并不是改变对象;

三.常引用

void TestConstRef()
 {
   const int a = 10;
   //int& ra = a;   // 问题1.该语句编译时会出错,a为常量
   const int& ra = a;
   // int& b = 10;  // 问题2.该语句编译时会出错,b为常量
   const int& b = 10;
   double d = 12.34;
   //int& rd = d;  // 问题3.该语句编译时会出错,类型不同
   const int& rd = d;//那为什么这个可以???
 }

问题1. 10为常量,常量是只能用,但不能改。然后const Int a; 这个加上了const 让变量a也变成只能用 不能改,让a有了常属性,而Int& ra = a ;相当于  Int& ra = 10;这时 Int& 的属性是可以用可以改的,而10不能改,见过 10 = a 吗?一定是没有的叭,所以俩边权限不一样,所以报错。

问题2.同理 ;

问题3.先来看这段代码。

double a = 5.2;
int b = a ;//隐形类型转换

这段代码因为类型不一样,所以a会创建一个临时变量,用这个临时变量去代替a去执行第二条语句;

double d = 12.34;
const int& rd = d;

那现在来看这个为什么可以成功了,d先转换成int 类型的临时变量,第二行左边加是了const也具有常属性,俩边都是Int 只能用不能改类型,所以可以执行成功。

四.使用场景

1. 做参数

引用传递

注:再次强调别理解成取地址啦!

2. 做返回值

先看这一段代码

int& Count()
 {
   static int n = 0;//为什么要加static呢?
   n++;
   // ...
   return n;
 }

来看一下不加static的代码

这为什么ret的值不是3呢??是因为Add(1,2)返回后是这样的int& ret = c ;c和ret共用一块地址,然后Add(1,2)函数使用完这块空间释放了,后续有操作利用这个空间可能会覆盖这个值

所以加上static让其变成全局变量函数结束时就不会释放该内存,不让其被其他值覆盖。

五.效率性

值返回引用返回时间的300多倍;为什么呢??是因为值返回和值传递需要拷贝一份,而引用不需要,效率嘎嘎高;

六.引用和指针的区别

1. 引用在定义时必须初始化,指针没有要求。

2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体。

3. 没有NULL引用,但有NULL指针。

4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)

5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。

6. 有多级指针,但是没有多级引用。

7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。

8. 引用比指针使用起来相对更安全。

ps:让我们一起学习C++的知识叭,坚持记录学习的知识。一起加油!!

  • 67
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,函数参数传递可以通过值传递(pass by value)和引用传递(pass by reference)两种方式进。 值传递: - 值传递是指将实际参数的值复制给形式参数,函数内部对形式参数的修改不会影响到实际参数。 - 在函数调用时,会创建形式参数的副本,函数对形式参数的操作只会影响到副本,并不会改变实际参数的值。 - 值传递适用于简单的数据类型,如整型、浮点型、字符型等。 - 值传递的优点是简单、直观,并且不会改变原始数据。但对于大型结构体或对象,值传递会产生额外的内存开销。 引用传递: - 引用传递是指将实际参数的引用传递给形式参数,函数内部对形式参数的修改会影响到实际参数。 - 引用传递通过使用引用作为函数形参,可以直接访问和修改实际参数的值。 - 引用传递适用于需要修改实际参数或传递大型结构体或对象的情况。 - 引用传递的优点是效率高,不会产生额外的内存开销,并且可以直接修改实际参数的值。但需要注意引用传递可能会对原始数据造成意外的修改。 使用值传递还是引用传递应根据实际情况来决定。一般来说,对于基本数据类型和小型结构体可以使用值传递,而对于大型结构体或需要修改实际参数的情况,应使用引用传递。此外,也可以使用`const`修饰引用参数,以确保函数内部不会修改实际参数的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值