• c++超详细引用篇【c++】


    目录

    一、引用的概念

    二、应用特性

    三、常引用

    四、使用场景


    一、引用的概念

    引用不是重新定义一个变量,而是给一个已经存在的变量取了一个别名,编译器不会为了应用变量去开辟一个空间,但是别名和那个存在的变量共享一个内存空间。

    比如:李逵在家叫“铁牛”,在江湖上称作“黑旋风”。

    引用的符号为“&”

    使用案例

    1. void TestRef()
    2. {
    3. int a=10;
    4. int &ra=a;
    5. printf("%p\n",a);
    6. printf("%p",ra);
    7. }

     测试结果:

     说明它们所调用的是同一个空间。

    1. void Test()
    2. {
    3. int a = 10;
    4. printf("%d\n", a);
    5. int& ra = a;
    6. printf("a=%d,ra=%d", a, ra);
    7. }

    测试结果: 

     说明一个变量和他的引用权限是一样的,就像你叫李逵和叫他黑旋风效果是一样的。

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

    二、应用特性

    1.引用在定义时必须初始化,因为它在定义后是无法改变自己的引用变量的。

    2.一个变量可以有多个引用,一个人也可以有多个小名。

    3.引用一旦引用一个实体就不能再引用别的实体了。

    1. void TestRef()
    2. {
    3. int a=10;
    4. int &ra=a;
    5. int &rra=a;
    6. printf("%p %p %p ",a,ra,rra);
    7. }

    测试结果:

     三、常引用

    1. const int a=10;
    2. int &ra=a;

    这一段代码会引发报错

    原因是:a只能读不能写,但是你写了一个引用ra想把它从一个只能读取的变量变成能读能写的变量。

    原理:引用一个变量,你可以在权限层次上平移权限,也可以将权限缩小了引用。

    这段代码应该改为:

    1. const int a=10;
    2. const int &ra=a;

    权限缩小怎么缩小呢:

    1. int a=10;
    2. const int &ra=a;

    常引用还有一个比较重要的用法,用来存储常量:

    1. void Test()
    2. {
    3. int a = 0;
    4. double d = 12.34;
    5. a = d;
    6. }

    这一段代码虽然在编译器不会报错而且也能成功编译,但是你知道这是什么原理吗

      

     double类型数据d在传送给a之前会进入临时空间,然后a变量再在临时空间取数据,这样子就会数据截断,在a存入12。

    这个临时空间具有常性,所以下面这段代码会报错:

    1. void Test3()
    2. {
    3. int &a=10;
    4. }

     

     因为10其实也是一个临时空间里的数据,临时空间具有常性需要用const的引用来装这个数据

     四、使用场景

    1.做参数

    1. void Swap(int& left, int& right)
    2. {
    3.   int temp = left;
    4.   left = right;
    5.   right = temp;
    6. }

    这个其实类似于指针,指针传送地址进来,函数里的值改变,函数外的值也随之改变。引用把变量的别名传进来,也就相当于将变量的使用权传进来了。

    2.做返回值

    1. int& Count()
    2. {
    3.   static int n = 0;
    4.   n++;
    5.   // ...
    6.   return n;
    7. }
    8. int main()
    9. {
    10. int ret=Count();
    11. return 0;
    12. }

    引用做返回值有一个好处,可以提高程序效率。

     调用Test4函数结束后,它的函数栈也会销毁,变量n也会不存在了。那我们是怎么在函数结束后将返回值返回给ret的呢?编译器会在内存中申请一个寄存器存放n的值,再将值传给ret。

    但是在Count函数里,是没有这一个过程的,static会将n存放在另一个空间,在函数栈销毁后依然存在,这是直接返回引用值可以直接将n的值返回给ret2,这样就可以省去中间的步骤,提高效率。

     

  • 相关阅读:
    ChatGPT的ABAP能力如何?
    从Apollo配置中心看分布式架构设计
    02 记一次 netty 内存泄露
    一文了解模型量化中的QAT和PTQ
    Mysql相关操作命令合集
    关于asio2项目example目录中的几个tcp示例的说明
    spring-boot notes
    自然语言处理——基础篇01
    AI项目十七:ResNet50训练部署教程
    Unity学习之Shader
  • 原文地址:https://blog.csdn.net/qq_64484137/article/details/126922728