• 【C++】c++引用和小细节



    c++引用不是定义了新的对象,而是对一个已有的对象起了一个别名,如鲁迅和周树人的关系,鲁迅是周树人的笔名,两者是一个东西,只是名字不同,正确来讲,编译器不会为了引用变量再开空间,它和它引用的空间使用了同一块内存空间

    在这里插入图片描述


    一、

    使用格式:
    类型& 引用变量名(对象名)=引用实体

    int a=10;//定义实体a
    int &b=a;//给实体起别名b
    
    • 1
    • 2

    ps:引用类型和实体必须要是同一类型

    引用的特性:

    引用的特性:
    1.引用在定义时必须初始化,这点不同于指针,因为指针可以不赋初值
    2.一个变量可以有多个引用,也可以给引用起引用,但它们指向的是同一个实体
    3.引用一旦初始化,就不能更改实体对象,这点不同于指针,指针可以更改指向的空间,但引用不可以


    引用的实质

    引用实际就是给实体对象起别名,如定义 int a = 10;此时系统开辟了一片空间,里面存储了10,a是它的名字,定义int& b = a,就是给这片空间又起了一个小名。
    在这里插入图片描述

    引用权限

    1.在c++中我们可以给常量起别名,方式和给变量起别名一样,整数在c++中默认类型为int ,浮点数为double
    2.引用时别名的权限不能放大,只能缩小或平移

    //权限放大
    //vs2019编译器会报错,权限大于了实体
    int& a=10;//错误的给常量起别名
    
    const int b=10;//定义常变量
    int &c=b;
    
    //权限平移
    //编译器不会报错
    const int& a=10
    
    const int b=10;
    const int&c=b; 
    
    //权限的缩小
    编译器不会报错
    int a=10;
    const int& b=a;
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    使用场景

    1.引用做参数,以往用函数我们实现swap()一般都要使用指针实现传址传参,但c++的引用可以方便的解决这个问题

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

    2.引用做返回值

    int& Count()
    {
     static int n = 0;
     n++;
     // ...
     return n;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在函数中,引用不管是做参数或返回值效率一般都会更高,例如
    现在有函数实参为一个有10000个节点的链表,那么函数形参需要拷贝这10000个节点,这样会浪费大量空间,这个时候,参数使用引用,就不需要拷贝那么多节点,实参和形参都指向一片地点

    引用和指针的区别

    1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
    2. 引用在定义时必须初始化,指针没有要求
    3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
    4. 没有NULL引用,但有NULL指针
    5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
    6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
    7. 有多级指针,但是没有多级引用
    8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
    9. 引用比指针使用起来相对更安全
  • 相关阅读:
    在页面中使用store中的成员
    戏说领域驱动设计(三)——困境
    日常开发小汇总(3)js类型判断
    codeforces 726 E2
    C++多线程
    elasticsearch的基本操作
    《JAVA设计模式系列》访问者模式
    【sql】sql知识汇总
    Java中使用 MD5 工具进行对密码进行加密
    maven基础学习
  • 原文地址:https://blog.csdn.net/weixin_70273825/article/details/134027745