仔细区分指针(pointers)和引用(references)

仔细区分指针(pointers)和引用(references)

本文指针和引用使用Pointers和References。


1、references不能不代表任何对象:

首先,没有所谓的null references,一个reference必须总代表某个对象,所以如果你有一个变量,其目的是用来指向另一个对象,但是也有可能他不指向(代表)任何对象,那么应该使用pointer。因为pointer可以设为null。换个角度,如果这个变量总是必须代表一个对象,也就是说如果你的设计并不允许这个变量为null,那么你应该使用reference。

错误行为:

char *pc = 0;
char &rc = *pc;
cout << rc << endl;

这是有害行为,结果不可预期(C++对此没有定义),编译器可以产生任何可能的输出。所以永远不再考虑“reference 成为 null”的可能性。

由于reference一定得代表某个对象,C++因此要求references必须有初值。

    string &rs;         //错误!references必须初始化
    string s("xyz");
    string &rs = s;

但是pointers就没有这样的限制:但是未初始化的指针,有效但风险高。

string *ps;

没有所谓的null reference这个事实意味着使用references可能会比使用pointers更富效率。这是因为使用reference之前不需要测试其有效性:

void printDouble(const double &rd)
{
    cout<

2、Pointers可以被重新赋值:

Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总指向(代表)它最初获得的那个对象:

    string s1("Nancy");
    string s2("Clancy");
    string &rs = s1;            //rs代表s1
    string *ps = &s1;           //ps指向s1
    rs = s2;                    //rs仍代表s1,但是s1的值现在变成了“Clancy"
    cout<

一般而言,当你需要考虑“不指向任何对象”的可能性时,或是考虑“在不同时间指向不同对象”的能力时,就应该采用pointer。前一种情况你可以将pointer设为null,后一种情况你可以改变pointer所指对象。

当你确定“总是会代表某个对象”,而且“一旦代表了该对象就不能够在改变”,那么应该选用reference。

3、其他情况

还有其他情况也需要使用reference,例如当你实现某些操作符的时候,最常见的例子就是operator[]。这个操作符很特别的必须返回某种“能够被当做assignment赋值对象”的东西。


结论:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其他语法需求无法由pointers达成,就应该选用references。任何其他时候,请用pointers。

 

你可能感兴趣的:(More,Effective,C++)