• 复合类型之一 引用


    总:复合类型

    复合类型是基于其他类型定义的类型,这里介绍两种复合类型 引用与指针,今天先看引用,指针见下一篇

    1.1.引用(reference)

    C++11中新增了一种引用:所谓的“右值引用”,主要用于内置类型,严格来说,当我们使用术语“引用”时,指的其实是“左值”引用。

    引用是为对象起了另外一个名字,引用类型引用另外一种类型。假设d是声明的变量名:

    int ival = 1024; 

    int &refVal = ival;      //refVal 指向 ival (是 ival的另外一个名字);

    int &refVal2;             //绝对错误,引用必须要初始化;

    关于为什么必须初始化:一般在初始化变量时,初始值会被拷贝到新建德尔对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是把初始值拷贝给引用,一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。


    引用即别名:

    引用并非对象,相反的,它只是一个已经存在的对象所起的另外一个名字。定义了引用之后,对其进行的所有操作都是在与之绑定的对象上进行的:

    int ival = 1024; 

    int &refVal = ival;      //refVal 指向 ival (是 ival的另外一个名字);

    refVal = 2;                //把2赋给refVal 指向的对象,此处就是赋给了ival;

    int ii = refVal;            //这和 ii = ival 等价;

             为引用赋值,实际就是把值赋给了与引用绑定的对象。获取引用的值,实际是获取了与引用绑定的对象的值。同理,以引用作为初始值,实际上是以引用绑定的对象作为初始值。


    引用本身不是对象,所以一定不能定义引用的引用;

    引用的定义:

    允许在一条语句中定义多个引用,其中每个引用都必须以&开头,引用只能绑定在对象上,而不能与字面值或者哪个表达式的结果绑定在一起:

    int &refVal4 = 10;               //错误,引用类型的初始值必须是一个对象

    double dval = 3.14;

    int &refVal = dval;           //错啦,对应起来,这里引用的类型的初始值必须是 int 型


    一般情况下:所有引用的类型都要和与之绑定的对象严格匹配。但是,不一般的情况下,有两种例外:

        例外一:

      在初始化常量引用时,允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可;尤其是允许为一个常量引用绑定非常量的对象、字面值,甚至是一个一般表达式:

    int i = 12;

    const int &r1 = i;      //允许将 const int & 绑定到一个普通int 对象上;

    const int &r2 = 12;  //正确:r1 是一个常量引用;

      const int &r3 = r1*2; // 正确:r3 是一个常量引用;

    int & r4 = r1*2;      //错误:r4只是一个普通的非常量引用;

    当 double dval = 3.14;

        const int& ri = dval; 发生了如下的转换:

        const int temp = dval;

    const int& ri = temp;


    例外二:

    存在继承关系的类:此处见后来博文:


  • 相关阅读:
    第七周作业
    第六周作业
    第五周作业
    第四周作业
    第三周作业
    第二周作业
    求最大值及下标
    查找整数
    抓老鼠
    第五周作业
  • 原文地址:https://www.cnblogs.com/melons/p/5791886.html
Copyright © 2020-2023  润新知