• C++(二十一) — 引用概念及本质


     1、引用概念

       引用是别名必须在声明的时候初始化。即:是指一个已定义变量的别名(一个内存空间,有两个名字都可以操作)

      引用:在函数调用时,是变量的别名,不可以单独存在,使用时必须要初始化

      指针:本身有自己的地址,可以单独存在。

     2、引用基本举例

       引用在交换时的例子:

    void myswap01(int a, int b)
    {
        int c = 0;
        c = a;
        a = b;
        b = c;
    }
    
    void myswap02(int *a, int *b)
    {
        int c = 0;
        c = *a;
        *a = *b;
        *b = c;
    }
    
    // 引用,变量的别名,指代同一个存储空间
    void myswap03(int &a, int &b)
    {
        int c = 0;
        c = a;
        a = b;
        b = c;
    }
    
    void main()
    {
        int x = 10, y = 20;
    
        myswap01(x, y);
        cout << "x= " << x << "        y= " << y << endl;
    
        myswap02(&x, &y);
        cout << "x= " << x << "        y= " << y << endl;
    
        myswap03(x, y);
        cout << "x= " << x <<"        y= " << y << endl;
    
        system("pause");
    }

    3、引用本质思考

     (1)引用就是别名,指向同一块内存空间。

     (2)引用占用字节:int &a,,占用4个字节就相当于一个指针所占的内存;引用有自己的存储空间,保存地址;

    struct teacher
    {
        int age; // 4
        char & a;//4,,相当于一个指针,占用4个字节
        double &b;//4
    };
    
    void main()
    {
        cout << sizeof(teacher) << endl;//12
        system("pause");
    }

     (3)本质:引用在C++中的内部实现:一个常量指针,所以引用所占内存大小和指针相同;

      int& age ——> int* const age

       相当于:编译器帮我们取了一个实参地址。

     4、引用作为函数返回值

       1、函数返回值为引用时,内存空间是必须要存在的(静态变量、全局变量),如果返回的是栈变量(局部变量),会出错,因为局部变量在函数返回时,地址就销毁了,比如下面的错误例子:

    int& get2()
    {
        int a;
        a = 10;
        return a;
    }

      如果返回的引用值,是静态变量或全局变量,则可以。

      关键:看返回的内存空间是不是有效的内存空间。

      2、引用作为左值,关键:看返回的内存空间是不是有效的内存空间。

    // 返回的是一个值
    int get1()
    {
        int a;
        a = 10;
        return a;
    }
    
    // 返回的是变量本身
    int& get2()
    {
        static int a =10;
        a++;
        cout << "a:" << a << endl;
        return a;
    }
    
    void main()
    {
        get2() = 100; // 10
        get2();       // 101
    
        system("pause");
    }

     5、常量引用

    int x = 10;
    // 常量引用,变量只有只读属性,不能通过 y 去改变 x 的值
    // 必须要初始化
    const int &y = x;
    
    // int &m = 11;// 11没有内存地址,所以错误,
    const int &z = 12;  // 此时常量引用可以,编译器分配了内存空间给 Z,保存值:12
  • 相关阅读:
    我孤独吗?我软弱吗?
    DataGrid 中的 HyperLinkColumn 如何传递多个参数?(未整理)
    C# 获取 MAC地址!
    (文本)文件操作
    ioninfinitescroll实现上拉分页加载更多
    前端面试题:防抖的实现
    vue 传送门功能,实现模态窗口
    前端面试题:节流的实现( 减少一段时间的触发频率)
    vue中的render函数
    ionic5实现tab栏切换效果
  • 原文地址:https://www.cnblogs.com/eilearn/p/10146894.html
Copyright © 2020-2023  润新知