第5课.引用的本质分析

Posted huangdengtao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第5课.引用的本质分析相关的知识,希望对你有一定的参考价值。

1.引用的意义

a.作为变量别名而存在,在一些场合代替指针
b.相对于指针来说具有更好的可读性和实用性
技术图片

注:函数中的引用形参不需要进行初始化
使用指针
技术图片

使用引用
技术图片

2.特殊的引用

a.在c++中可以声明const引用
const Type& name = var; //这里使a为只读变量
const 引用让变量拥有只读属性(只可间接的去修改)
技术图片

b.当使用常量对const引用进行初始化时,常量分配空间,并将引用名作为这段空间的别名(不使用consr不能使用常量对引用初始化)

    const  int& b = 1;        //分配一个空间,空间名为b,其中值为1
    int *p = (int *) &b;
    b = 5;             //对只读变量赋值,error    
    *p = 5;            //间接赋值

eg:

    #include <stdio.h>
    void Example()
    {
        printf("Example:
");

        int a = 4;
        const int& b = a;
        int* p = (int*)&b;

        //b = 5;           //错误语句

        *p = 5;

        printf("a = %d
", a);
        printf("b = %d
", b);
    }

    void Demo()
    {
        printf("Demo:
");

        const int& c = 1;
        int* p = (int*)&c;

        //c = 5;            //    错误

        *p = 5;

        printf("c = %d
", c);
    }

    int main(int argc, char *argv[])
    {
        Example();

        printf("
");

        Demo();

        return 0;
    }

思考:引用有他自己的存储空间吗?
引用在c++中的内部实现就是一个指针常量(Type *const name)
技术图片

注意:
a.c++编译器在编译过程中使用指针常量作为引用的内部实现,所以引用所占空间大小与指针相同(4byte)
b.从使用的角度,引用只是一个别名,c++为了实用性隐藏了引用的存储空间这一细节

#include <stdio.h>

int& demo()
{
    int d = 0;
    
    printf("demo: d = %d
", d);
    
    return d;             //返回引用(int&)即返回(int *const),也就是需要返回d的地址。
                                      //返回地址后,这段数据在这个函数结束后就被,释放了。有问题
}

int& func()
{
    static int s = 0;            //static 决定返回的数据不会被释放掉,所以下面返回时不会有问题
    
    printf("func: s = %d
", s);
    
    return s;
}

int main(int argc, char* argv[])
{
    int& rd = demo();            //int& rd = d;
    int& rs = func();              //int& rs = s;
    
    printf("
");
    printf("main: rd = %d
", rd);        //???
    printf("main: rs = %d
", rs);        //0
    printf("
");
    
    rd = 10;
    rs = 11;
    
    demo();        //0
    func();          //11
    
    printf("
");
    printf("main: rd = %d
", rd);        //???
    printf("main: rs = %d
", rs);        //11
    printf("
");
    
    return 0;
}

技术图片

以上是关于第5课.引用的本质分析的主要内容,如果未能解决你的问题,请参考以下文章

第27课 数组的本质分析

第0-0课 - 引言

第51课 继承对象模型分析——多态的本质分析

数据-第5课-线性表的本质

第5课 - 线性表的本质

第28课 指针和数组分析(上)