• C++ 引用


    引用是某个对象(即变量)的别名.即某个对象的替代名称(相同于一个人的小名).

    引用是一个左值,在C++中,引用主要用来定义函数的参数和函数返回类型.

    因为引用只需要传递一个对象的地址,在传递大型对象的函数参数或从函数返回大型对象时,可以提高效率. 

    使用引用时的注意事项:

    ①在定义引用时,引用符&与指针运算符一样,在类型和引用名之间的位置是灵活的,下面 3 种定义是完全相同的。

    int& ir = i;       //& 靠近类型
    
    int & ir = i;      //& 2不靠近
    
    int &ir = i;       //& 靠近变量

    ②在变量声明时出现的&才是引用运算符(包括函数参数声明和函数返回类型的声明),其他地方出现的&都是地址操作符。

    int i;
    int &ir = i;                  //引用
    int& func(int &i1, int &);    //引用参数,函数返回引用

    ③引用必须在定义时初始化,不能在定义完成后再给它赋值,为引用提供的初始值,可以是一个变量,也可以是另一个引用名,同一个变量可以定义多个引用

    float f;
    float &fr = f;
    float &r1 = f;
    float &r2 = f;
    float &r3 = r1;

    ④引用实际是一种隐式指针,但是与指针的用法有很大的区别

      ❶ 指针必须通过解引用运算符"*"才能访问它所指向的内存单元.而引用不需要,用法与普通变量一样.

      ❷ 指针是一个变量,可以重新赋值.但是引用必须在定义时进行初始化,以后不能成为其他变量的引用.

        ❸ 有空指针,无空引用。

        ❹ 由于指针也是变量,所以可以有指针变量的引用。 

    ⑤建立引用时,有以下3个限制

          ❶ 引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针

          ❷ 不能建立引用数组

          ❸ 不能建立数组的引用

          ❹ 两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝 

    //两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝
    
    #include<iostream>
    using namespace std;
    
    void pt(int *pta,int *ptb)
    {
        int *ptc;
        ptc=pta;
        pta=ptb;
        ptb=ptc;
    }
    
    void ref(int &ra,int &rb)
    {
        int rc;
        rc=ra;
        ra=rb;
        rb=rc;
    }
    
    int main()
    {
    
        int a=3;
        int b=4;
        int *pa=&a;
        int *pb=&b;
    
        pt(pa,pb);
        cout<<"zhizhen: a="<<a<<",b="<<b<<endl;
    
        a = 3;
        b = 4;
        ref(a,b);
        cout<<"yinyong: a="<<a<<",b="<<b<<endl;
    
        return 0;
    }
    /*
    输出结果:
    
    zhizhen: a=3, b=4
    yinyong: a=4, b=3
    */ 

    ⑥当使用&运算符取一个引用的地址时,实际上取到的是引用的变量的地址.

    int i = 9;
    int &ir = i;
    int *p1 = &ir;
    int *p2 = &i;
    
    //结果是 pi = p2

    ⑦从内存上来讲,系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。

    ⑧引用访问对象是直接访问,指针访问对象是间接访问。

       间接访问的含义是先从其它内存空间获得要访问的内存地址,根据得到的地址访问目的地址。

    ⑨如果返回动态分配的对象或内存,必须使用指针,引用可能引起内存泄漏。

     

    ---------------------------------------------------------------------------------------------------
    参考资料:
    <<C++面向对象程序设计(第二版)>>

    http://zhidao.baidu.com/question/321717839.html

    http://blog.renren.com/share/275441937/12967099702

    http://upc.gg.blog.163.com/blog/static/2979849820108281181754/

  • 相关阅读:
    Java集合之LinkedHashMap
    ConcurrentHashMap原理分析
    Java集合之HashMap
    JAVA集合之ArrayList
    Python内建函数
    Vscode 安装Java Spring项目
    音频质量评估-2
    音频质量评估-1
    Python list 实现
    怎么测试大数据
  • 原文地址:https://www.cnblogs.com/LubinLew/p/reference.html
Copyright © 2020-2023  润新知