Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2097156
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2013-07-02 21:08:34


    引用是一种复合类型,通过在变量名前添加“&”符号来定义。在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。
1、引用是别名
    引用只是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。
    规则:当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象上。
    上述规则的结果就是:必须在定义引用时进行初始化,初始化是指明引用指向哪个对象的唯一方法。
    
2、const引用
    const引用是指向const对象的引用。
  1. const int val = 1024;
  2. const int &refval = val; //ok,both reference and object are const
  3. int &ref2 = ival //error:nonconst reference to a const object
    可以读取但不能修改refval,因此,任何对refval的赋值都是不合法的。这个限制的意义是:不能直接对val赋值,因此不能通过使用refval来修改val。
    因为ref2是普通的非const引用,因此可以用来修改ref2指向的对象的值

    const引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:
  1. int i = 42;
  2. //legal for const reference only
  3. const int &r = 42;
  4. const int &r2 = r + i;
    但是,同样的初始化对于非const引用却是不合法的,而且会导致编译时错误。
  1. int ival = 1024;
  2. int &refval = ival; // ok
  3. int &refval2; //error:a reference must be initialized
  4. int &refval3 = 10; //error:initializer must be a object
    为什么会这样呢?
    观察将引用绑定到不同的类型时所发生的事情,最容易理解上述行为。假设我们编写
  1. double dval = 3.14;
  2. const int &r2 = dval;
    编译器会把这些代码转化成如下形式的编码:
  1. int temp = dval;
  2. const int &r2 = temp;
    如果r2不是const,那么可以给r2赋一个新值。这样做不会修改dval,而是修改了temp。期望对r2的赋值会修改dval,但是结果dval并没有修改。
    仅仅允许const引用绑定到需要临时使用的值完全避免了这个问题,因为const是只读的。

    记住:
    (1)非const引用只能绑定到与该引用同类型的对象;
    (2)const引用则可以绑定到不同但相关的类型的对象或绑定到右值(如整型字面值43等);


附:
    引用和指针的比较:
    (1)引用总是指向某个对象:定义引用时没有初始化是错误的。而指针在定义时则可以不进行初始化;
    (2)赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。而给指针赋值,则修改指针本身的值;
    (3)引用一经初始化,就始终指向同一个特定对象,不能修改。而指针在定义后则可以修改;
    (4)不存在指向空值的引用。而存在指向空值的指针。因此使用引用的代码效率比使用指针的要高,因为在使用引用之前不需要测试它的合法性。
    
    总体来说,在以下情况下你应该使用指针:
    (1)考虑奥存在不指向任何对象的可能(在这种情况下,可以设置指针为空);
    (2)需要在不同的时刻指向不同的对象(在这种情况下,可以改变指针的指向);
   
    总体来说,在以下情况你应该使用引用
    (1)如果总是指向一个对象并且一旦指向一个对象就不会再改变指向;
    (2)当你重载某个操作符时,你应该使用引用,避免不必要的语义误解;
    最普通的例子是操作符[],这个操作符典型用法是返回一个目标对象,其能被赋值。
  1. vector v(10); //建立整型向量,大小为10
  2. //向量是一个在标准库中的一个模板
  3. v[5] = 10; //这个被赋值的目标对象就是操作符[]返回的值
    如果操作符[]返回一个指针,那么后一个语句就得这样写:    
    *v[5] = 10;
    但是,这样会使得v看上去像一个向量的指针。
    因此,会选择让操作符返回一个引用。

    




阅读(1757) | 评论(0) | 转发(0) |
0

上一篇:C/C++中的const限定符

下一篇:C++中函数

给主人留下些什么吧!~~