zoukankan      html  css  js  c++  java
  • 引用和指针的比较

    以下内容摘抄自:高质量程序设计指南:C++C语言(第三版) 林锐 P152

    引用符号:“&”

    在此并非取地址的意思。

    int m;

    int& n=m;

    n是变量m的一个引用(Reference),m是被引用物(Referent).

    n相当于m的别名,对n的任何操作都是对m的操作。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m自己。

    引用的特性及其与指针的比较如下:

    1.引用在创建的同时必须初始化,即引用到一个有效的对象。而指针在定义的时候不必初始化,可以在定义的任何地方重新赋值。

    2.不存在NULL引用, 引用必须与合法的存储单元关联;而指针则可以是NULL。如果把一个引用初始化为0,例如:

    const int& rInt = 0;

    其语义并非是把引用初始化为NULL,而是创建一个临时的int对象,并用0来初始化它,然后再用它来初始化引用rInt,该临时对象将会一直保留到rInt销毁的时候才销毁。

    所以,不要用字面常量来初始化引用

    3.引用一旦被初始化为指向一个对象,它就不能被改变为对另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象,给引用赋值并不是改变它和原始对象的绑定关系,例如:

     int  a = 10, b = 1000;

    int& rInt = a;  //rInt 引用到a, rInt = 10;

    rInt = b;    //rInt 和a 都变成了 1000;

    这并非是让rInt改变初衷而引用到变量b,而是把b的值赋值给变量a,以后对rInt的使用仍然是在使用a而不是b。相反,指针就不大一样了,例如:

    int *pInt = &a; //pInt指向变量a 

    pInt = &b;

    4、引用的创建和销毁并不会调用类的拷贝构造函数和析构函数。

    5、在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换。

    引用的主要用途是修饰函数的形参和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递,指针传递和引用传递。

    引用既具有指针的效率,又具有变量使用的方便性和直观性。

  • 相关阅读:
    “main cannot be resolved or is not a field”解决方案
    .net学习笔记----有序集合SortedList、SortedList<TKey,TValue>、SortedDictionary<TKey,TValue>
    MVC学习笔记---ModelBinder
    MVC学习笔记---MVC框架执行顺序
    服务器知识----IIS架设问题
    C/C++学习笔记---primer基础知识
    C/C++学习笔记----指针的理解
    C#学习笔记-----C#枚举中的位运算权限分配
    CSS学习笔记----CSS3自定义字体图标
    Clr Via C#读书笔记----基元线程同步构造
  • 原文地址:https://www.cnblogs.com/zhehan54/p/5128632.html
Copyright © 2011-2022 走看看