条款1:仔细区别pointers和references

**
印象笔记:
本文描述pointers和references的差异,并告诉你它们的适当使用时机。
**

首先必须认知一点,没有所谓的null reference一个reference必须总代表某个对象。换个角度说,如果这个变量总是必须代表一个对象,也就是如果你的设计并不允许这个变量为null,那么你应该使用reference。

先看一种情况:

int *pc=0;  //将pointer设定为null
int& rc=*pc;    //让refere代表nullpointer的解引值
cout<

这段代码将使程序产生的结果不可预期(C++对此没有定义),所以我们将永远不再考虑“reference成为null”的可能性。

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

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

但是pointers就没有这样的限制:

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

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

void printDouble(const double& rd)
{
    cout<//不需要测试rd,它一定代表某个double
}

如果使用pointers,通常就得测试它是否为null

void printDouble(const double *pd)
{
    if(pd){ //检查是否为null pointer
        cout<//不需要测试rd,它一定代表某个double
    }
}

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

string s1("Nancy");
string s2("Clancy");

string& rs=s1;  //rs代表s1 
string *ps= &s1;    //ps指向s1 
cout<//输出Nancy 
cout<<*ps<//输出Nancy

rs=s2;  //rs仍然代表s1,但是s1的值现在变成了"Clancy" 
cout<//输出Clancy 
ps=&s2; //ps现在指向s2,s1没有变化 
cout<//输出Clancy 
cout<<*ps<//输出Clancy 

一般而言,当考虑“不指向任何对象”的可能性或是考虑“在不同时间指向不同对象”的能力时,应该采用pointer。而当你确定“总是会代表某个对象”,而且“一旦代表了该对象就不能够再改变”,那么应该选用reference。

最后,书中下了一个结论:

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

你可能感兴趣的:(《More,Effective,C++》笔记)