美文网首页
【记3】引用的概念和本质

【记3】引用的概念和本质

作者: CozyMoonquake | 来源:发表于2018-05-29 11:59 被阅读0次

    一、引用的概念。
    引用没有定义,是一种关系型声明,声明它和原有某一变量(实体)的关系,故其类型与原类型保持一致,且不分配内存,与被引用的变量具有相同的地址。
    在声明的时候必须初始化,一经声明,不可更改,以下的re已经声明了是a的引用,就不能再成为b的引用了。
    另外,可对引用再次引用,多次引用的结果,即某一变量具有多个别名,以下的re和re1即都是a的别名。
    因此,符号&前有数据类型时,表示引用,其它皆为取地址。在传递参数时,引用比指针更方便。

    #include<iostream>
    using namespace std;
    int main(void)
    {
        int a=10;
        int b=20;
    
        int *p=&a;
        *p=30;
        p=&b;
        *p=40;//改变的是b
    
        cout<<"a="<<a<<endl;
        cout<<"b="<<b<<endl;
    
        int &re=a;//int & 是引用数据类型,re是a的别名
        re=50;
        cout<<"a="<<a<<endl;
    
        re=b;//re不能成为b的引用
        re=60;
        cout<<"a="<<a<<endl;
        cout<<"b="<<b<<endl;
    
        int &re1=re;
        re1=70;
        cout<<"a="<<a<<endl;
        cout<<"re="<<re<<endl;
        cout<<"re1="<<re1<<endl;
    
        return 0;
    }
    

    二、引用的本质。
    1、引用和指针占用的空间大小是相同的。
    2、引用和常量一样,都必须要初始化。
    由以上两点,引用实现的底层即是一个常指针,即
    int &re=a;
    等价于
    int *const re=&a;
    举例如下:

    void change1(int *const a) //int *const a = main::&a
    {
        *a = 100;    
    }
    void change2(int &a)//当我们将引用作为函数参数传递时,编译器会替我们将函数实参取地址给引用
                        //int &a = main::&a
    
    {
        a = 100;        //对一个引用操作时,编译器替我们对隐藏*操作
    }
    

    总结,当我们去研究一个引用的时候,可以将其当做一个常指针来研究。但当我们使用引用来编程的时候,只需将其当做变量的一个别名即可,这样会方便许多,避免理解上的混乱。另外,引用作为返回值时,不要返回局部变量的引用,否则若会在外部对该引用再次进行引用时,由于局部变量的生命周期已随着函数的执行完毕而销毁,由此会造成不安全事件。以上问题解决方法可以使用static静态变量,此时的引用作为函数返回值时,可以在外部作为左值使用。

    相关文章

      网友评论

          本文标题:【记3】引用的概念和本质

          本文链接:https://www.haomeiwen.com/subject/wvbojftx.html