• 引用和指针的差别


    引用(references)使用“.”操作符,指针(pointers)使用“*”和“->”操作符,这是两者最基本也是最熟悉的差别了,应该不用详说。

    首先,没有所谓的null reference。一个reference必须总代表某个对象,因此C++要求references必须有初值

    string& rs;//错误!references必须被初始化

    string s("xyzzy");

    string& rs = s;//没问题,rs指向s

    可是pointers就没有这种限制,虽然有非常大的风险:

    string* ps;//未初始化的指针,有效,但风险高

    尽管C++没有这种限制,可是我们在声明一个指针的时候也最好要初始化,避免出现野指针。

    以下这样的情况也是不被同意的,要禁忌:

    char* pc = 0;//将pointer设定为null

    char& rc = *pc;//让references代表null pointer的解引值

    这是有害的行为,其结果不可预測(C++)对此未定义,编译器能够产生不论什么可能的输出。所以,

    我们要永远不再考虑“reference称为null“的可能性。

    上面的事实意味着使用reference可能会比使用pointer更富效率。这是由于使用reference之前不须要測试其有效性:

    void printDouble(const duble& rd)

    {

         cout << rd;//不须要測试rd,它一定代表某个double

    }

    void printDouble(const double* pd)

    {

       if (pd)//检查是否为null pointer

       {

              cout << *pd;

       }

    }

    其次,pointers和references之间的还有一个重要的差异就是,pointers能够被又一次赋值,指向还有一个对象,references却总是指向(代表)它最初获得的那个对象:

    string s1("Nancy");

    string s2("Clancy");

    string& rs = s1;//rs代表s1

    string* ps = &s1;//ps代表s1

    rs = s2;//rs仍然代表s1,可是s1的值如今变成了”Clancy“

    ps = &s2;//ps如今指向s2,s1没有变化

    还有其它情况也须要使用references,比如当你实现某些操作符的时候,最常见的样例就是operator[]。这个操作符非常特别地必须返回某种”能顾被当做assignment赋值对象“的东西:

    vector<int> v(10);//产生一个int vector,大小为10

    v[5] = 10;//assignment的赋值对象是operator[]的返回值

    因此,当知道须要指向某个东西,并且绝不会改变指向其它东西,或是当你实现一个操作符而其语法需求无法由pointers达成,你就应该选择references。不论什么其它时候,请採用pointers。

  • 相关阅读:
    linux网络编程之扫盲
    当lov变化时得到lov变化的值
    动态设置OAMessageChoiceBean值
    RSA host key for HOST has changed and you have requested strict checking
    64位整数的编译错误
    CSS让内容水平居中(固定宽度)
    如何计算亮度值
    adb新参数支持Android 2.2安装到SD卡上
    NSDateFormatter formatting
    Win7系统下Safari不能打开网页的解决方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4083055.html
Copyright © 2020-2023  润新知