浅析C++引用(Reference)

   引用(reference)是c++的一种新的变量类型,是对C的一个重要扩充。简单地说,“引用”就是对象的另一个名字。比如,大家都知道作家鲁迅的真实姓名是周树人,“鲁迅”和“周树人”都是用来称呼这同一位作家的。

    引用的定义形式很简单,在对象声明时,在对象类型和对象名之间添加“&”来表明该变量是一个引用类型。例如:

    int a = 10;
    int &b = a;

    这就定义了变量b是一种引用类型,且b是整数a的引用。

    非常需要牢记的是:引用必须在定义时进行初始化!

    在声明一个引用变量后,该引用就永久被“绑定”到的它所引用的变量。还举“鲁迅”的例子:自从周树人使用“鲁迅”这个笔名(引用)出名之后,大家提起鲁迅,都知道它代表着周树人,而不是其他人。而周树人是还可以有其他笔名的,因而某个对象也可以多个其他对象引用。所以:

    int a =10;
    int &b = a;
    int &c = a;    这样的引用是正确的。

    那么,C++中引入“引用”有何目的?总结来说,主要有以下几方面作用:

1. 传递可变参数

    在C语言中,函数在被调用时,参数传递采取的是“值传递”方式。变量值作为实参传递给形参,可是传递是单向的,即便形参在函数执行过程中发生了变化,也不会回传给实参,这主要是因为C中实参和形参不是同一个存储单元。所以形参的变化不会直接影响到实参。(通过某些间接的方式,如指针等手段还是能够实现形参影响实参的)。

    而引入了“引用”后,使用引用类型作为形参,则形参和实参共享同一块内存单元,那么他们就能够互相影响了。这就便于实现某些功能了。

2. 提高参数传递效率

    某些时候,我们可能会向函数中传入大型的对象作为参数,使用引用,不会创建副本,因而能够减少空间和时间上的消耗,提高函数效率。

3. 使用引用返回值

    如果一个函数返回了引用,那么该函数的调用也可以被赋值。举个例子,如下函数:

    int &max(int &a, int &b)
    {
        return a>b ? a : b;
    }
    max()函数返回一个整型的引用,那么max()这个函数也是a和b中较大者所引用对象的引用。如果a = 3, b = 4,那么max()就是b所引用对象的引用。然后我们执行 max(a, b)++ ,效果就是b的值变为5 。

4. 常引用

    常引用是一个有点复杂拗口难解释的东西。首先关于c和c++中const的用法,就挺复杂的。以前写过一个总结,一共三篇,在这里:关于C/C++中的const的用法的总结

    这里再来专门总结一下c++中常引用的用法:

    const引用是指向const对象的引用。声明形式: const 类型标识符 &引用名 = 目标变量名;
    例如:
            const int val = 1000;
            const int &ref1 = val; //Correct
            int &ref2 = val;    //Error

    在上面的两个引用中,第一个是正确的,而第二个是错误的。因为val是const类型,一旦初始化不能再被赋值或修改,所以它的引用也必须是const类型来确保不会赋值。

    还有一个常见的例子如下:
    int a ;
    const int &ref=a;
    ref=1000;     //Error
    a=1000;      //Correct

    《C++ primer》第二章中对const引用的用法给出了很精辟的注释:

    非const引用只能绑定到与该引用同类型的对象。
    const引用则可以绑定到不同但相关的类型的对象或绑定到右值。

    下面的引用是合法的:
    int i = 1000;
    const int &r1 = 500;
    const int &r2 = r1 + i;

5. 多态

    引用是除了指针另一个可以产生多态的方式。也就是说,一个基类的引用可以指向它的派生类的实例。

    class A;
    calss B: public A {..... };
    B b;
    A &ref = b;

    在这里,ref只能访问派生类对象中从基类继承下来的成员。如果基类A中定义了虚函数,而派生类重载了这个虚函数,就可以通过ref实现多态。

--------------End-----------------

参考:
《c++ primer》(第四版),Lippman
《c程序设计》(第二版),谭浩强
c++引用,百度百科,http://baike.baidu.com/view/2129184.htm?fr=ala0_1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值