• C++ 引用


    在研究引用的时候,把引用当成一个常指针去研究;

    在使用引用的时候,把引用理解成变量的别名就可以了。

    变量名

    实质

    一段连续存储空间的别名,是一个标号(门牌号)

    通过变量来申请并命名内存空间

    通过变量的名字可以使用存储空间

    引用的概念

    变量名,本身是一段内存的引用,即别名。引用可以看作一个已定义变量的别名

    语法

    Type &name=var;//type &是一个整体,说明使用引用数据类型

    可以通过指针改变指针指向空间的值,即可以通过解引用改变变量的值

    可以通过引用改变变量的值,并且引用没有分配新的内存空间,说白了,就是一个变量两个名字,本质上还是一个变量。

    规则

    1.引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。

    2.声明的时候必须初始化,一经声明,不可变更。

    3.可对引用,再次引用。多次引用的结果,是某一变量有多个别名【想取多少取多少】。

    4.&符号前有数据类型时,是引用。其它皆为取地址。

    引用作为函数参数

    普通引用在声明时必须用其它的变量进行初始化,引用作为函数参数声明时不进行初始化。

    将引用作为函数参数传递的时候,编译器会替我们将实参取地址给引用。

    int &a = main::&a;

    对一个引用操作赋值的时候,编译器替我们隐藏*操作。

    意义——某些情况下可代替指针 重要

    1.引用作为其它变量的别名而存在,因此在一些场合可以代替指针

    2.引用相对于指针来说具有更好的可读性和实用性

    C++中引入引用后,可以用引用解决的问题,避免用指针来解决。

    本质

    常量需要初始化,引用也需要初始化,引用可能是一个常量;引用所占的大小和指针相等。所以,引用可能是一个常指针。

    int *const p = &a;

    引用不开辟新的内存空间

    引用所占用的大小和指针相等(字节长度)

    C++编译器定义引用时,背后做了什么工作?

    普通引用有自己的空间吗?没有

    1.引用在C++中的内部实现是一个常指针

    Type&name Type* const name

    2.C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同

    3.从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏

    间接赋值的3个必要条件

    1.定义两个变量(一个实参,一个形参)

    2.建立关联,实参取地址传给形参

    3.*p形参去间接的修改实参的值

    引用在实现上,只不过是把:间接赋值成立的三个条件的后两步合二为一

    当实参传给形参引用的时候,只不过是C++编译器帮我们把程序员手工取了一个实参地址,传给了形参引用(常量指针)

    引用作为函数的返回值(引用当左值)

    引用作为返回值,不要返回局部变量的引用。因为会释放。

    引用如果当函数返回值,函数可以当左值。因为你返回的就是它的别名,它是有内存空间的。

    一、

    当函数返回值为引用时,若返回栈变量:

    不能成为其它引用的初始值(不能作为左值使用)

    二、

    当函数返回值为引用时,若返回静态变量或全局变量:

    可以成为其他引用的初始值(可作为右值使用,也可作为左值使用)

    总结

    引用作为函数返回值,

    如果返回值为引用可以当左值,

    如果返回值为普通变量不可以当左值。

    指针引用

    ???函数 void FreeTeacher(Teacher pT1)的形参是不是错的?是不是应该是Teacher* &pT1?

    if(*ttp!=NULL)

    free(*ttp);

    const引用

    const引用有较多使用。它可以防止对象的值被随意修改。因而具有一些特性。

    1.const对象的引用必须是const的,将普通引用绑定到const对象是不合法的。这个原因比较简单。既然对象是const的,表示不能被修改,引用当然也不能修改,必须使用const引用。实际上,

    const int a=1;

    int &b=a;

    这种写法是不合格的,编译不过。

    const int a=1;

    const int &b=a;

    2.const引用可使用相关类型的对象(常量,非同类型常量或表达式)初始化。这个是const引用与普通引用最大的区别。

    const int &a=2;是合法的

    double x=3.14;

    const int &b=x;也是合法的 //将引用的相容性扩大到赋值号的相容性

    const int temp=x;

    const int &b=temp;

    常引用:x可以自己改变,与此同时y也变,但是不可以通过y改变x

    原理

    为什么const引用和普通引用原理不同?

    普通引用只能引用同类型的左值,const引用将引用的相容性扩大到与“=”相容性相同的范围

    为什么要扩大?(哥哥理解)

    const引用通常用来作为函数的形参,在传参的过程可能参数类型不符,为了在传参的时候不报错、不重载函数,所以这样更加方便

    const引用的原理:

    int a;

    const int &b=a;

    原理:间接绑定

    const int temp=a;//赋值操作,将a的值赋给临时变量,赋值操作可以满足的就都可以const引用

    const int &b=temp;//b引用的是临时变量temp

    普通引用原理:

    int a;

    int &b=a;

    原理:直接绑定

    上图中myt.age是一个常量,不可修改。

    总结

    1.const int & e相当于const int * const e

    2.普通引用int &e;相当于int *const e

    3.当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

    4.使用字面量对const引用初始化后,将生成一个只读变量

  • 相关阅读:
    基于ssm框架的(非maven)学生选课管理系统
    Union-Find Algorithm-并查集
    2023最新版JavaSE教程——第4天:流程控制语句之循环语句
    【服务器数据恢复】RAID5多块硬盘先后离线的数据恢复案例
    编译原理网课笔记——第一章
    喜马拉雅后端一面
    spring_aop_学习笔记
    高等数学(第七版)同济大学 总习题四(前半部分) 个人解答
    前端常用网站
    【LC简单】387. 字符串中的第一个唯一字符
  • 原文地址:https://blog.csdn.net/weixin_65951505/article/details/133942148