C++的引用

 

C++的引用具备指针的所有功能,不过引用与指针的区别在于引用在定义时必须要初始化,因为引用对象不许为空,若对象可以为空,则定义指针变量,int i=9;int &s = i;

定义引用指向了i;其实引用相当于我们所说的"别名",是所指向的变量的别名,引用与变量共用一个内存地址

如:

int a ;  

int &b = a;  

 

他们的内存地址都是一块地址


 

只要内存地址的值发生改变,这两个变量的值都会改变,下面可以验证一下

代码

#include <iostream>   
  1. using namespace std;  
  2. int main()  
  3. {  
  4.    int a ;  
  5.    int &b = a;  
  6.   
  7.    a = 100; //内存地址值得改变,变量b的值也变   
  8.    cout << "b = " << b <<endl;  
  9.      
  10.    b = 200;//a的值也变   
  11.    cout << "a = " << a << endl;  
  12.    return 0;  
  13. }  

 

执行的结果:


 

    当一个引用初始化时指定到了一个变量,则这个引用的地址永远是该变量的地址,不会再改变,如果该引用再次指向别的变量,则只是把这个变量的值赋给该引用,

引用的地址不会改变,并且引用初始化时指向的变量的值也会改变,

 

 

   在C++中还可以定义一个类的对象的引用,与对象共享一块地址,不能定义第一个类的引用,因为类只是一种类型,没有内存地址,引用必须指向一块

内存地址,

#include <iostream>   
  1. using namespace std;  
  2.   
  3. class Test  
  4. {  
  5. public:  
  6.     void set(int val);  
  7.     int  Get();  
  8. private:  
  9.     int  i;  
  10. };  
  11.   
  12. void Test::set(int val)  
  13. {  
  14.     i = val;  
  15. }  
  16.   
  17. int Test::Get()  
  18. {  
  19.     return i;  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.    Test  T; //定义类的对象   
  25.    Test  &rT = T; //定义类的对象的引用   
  26.    //Test  &rTest = Test  //不能这样定义一个类的引用  
  27.      
  28.    T.set(20);  
  29.    cout << "对象的引用的rT.Get()值:" << rT.Get() << endl;   
  30.   
  31.    rT.set(40);  
  32.    cout << "对象的T.Get()值:" << T.Get() << endl;  
  33.    return 0;  
  34. }  


执行的结果:

 

    指针进行删除后一般要把指针指向空,而引用不需要,不管怎么样,引用永远指向初始化的内存空间,就算是指针的引用,指针进行删除
操作后,引用的内存地址还是不变,不过指针删除后内存的数据也被删除,如果对象在栈中,当对象超出作用域后,引用和对象一起消失,

如果对象在堆中,堆的空间必须使用指针访问,因为堆空间一般是手动分配,在分配内存时定义一个指针指向分配的空间,所以堆空间只能

指针访问,没必要用引用,不过可以定义指针引用但如果删除指针后,引用的地址不变,只是内存的数据被删除


 

       引用常见的使用是用于传递函数参数,使用时很好用,参数的传递常见的有按值传递,按地址传递和引用传递,在说引用传递前先看看前面的两种,

 

1. 按值传递

先看一下例子

 

 看执行的结果,通过set()函数后主函数的值还是不变,这是为什么?因为按值传递,只是把主函数a的值给了set()函数的a值,这两个a的地址不是同一个地址,

在执行的过程中,会把主函数a的地址的数据拷贝给set函数a的地址,通过调式可以看一下这两个a的地址

主函数a的地址:

 

set()函数a的地址

 

可以看到是不同的地址

 

2. 按地址传递

   可以看到主函数a的值通过set()函数后已经改变,其实这时候这两a是同一块内存地址,set()函数中的参数a是指针指向主函数a的地址,所以是同一

块内存地址,对set()中a的值修改,主函数中的a的值也改变,因为同那块内存地址的数据改变了;不过set()函数中要使用到指针,比较麻烦而且难使用,

所以就有了引用传递

 

3. 引用传递

 

  主函数中的a值经过set()函数后一样会发生改变,而且使用起来方便,不像使用指针那样难以管理,这就是使用引用比使用指针的好处

这样的话,只需要在函数参数中添加引用,这样就可以解决无法返回对个值,只需要把要返回的变量作为引用传递就可以改变多个变量的值

引用的传递在类的对象的应用中是相当有用的...

 

下面是一个视频资料的截屏

说明了按值传递与其他两种传递的不同之处

 

 

这里是使用引用容易出错的地方

 

 这是个引用传递对象,在fun()函数中的对象是区部对象,当fun()函数结束后这个对象也不存在了,所以在主函数中的类对象引用接收fun()函数的对象是不存在的,所以输出一个

随机值,那为什么下面这个就能正确输出?

 

其实这是在fun()函数返回时是使用了按值传递,fun()前没有了&,所以在主函数的引用接收到的fun()函数对象的值,

所以是正确的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值