**
印象笔记:
本文描述pointers和references的差异,并告诉你它们的适当使用时机。
**
首先必须认知一点,没有所谓的null reference,一个reference必须总代表某个对象。换个角度说,如果这个变量总是必须代表一个对象,也就是如果你的设计并不允许这个变量为null,那么你应该使用reference。
先看一种情况:
int *pc=0; //将pointer设定为null
int& rc=*pc; //让refere代表nullpointer的解引值
cout<<rc<<endl;
这段代码将使程序产生的结果不可预期(C++对此没有定义),所以我们将永远不再考虑“reference成为null”的可能性。
由于reference一定得代表某个对象,C++因此要求references必须有初值:
string& rs; //错误!references必须被初始化
但是pointers就没有这样的限制:
string *ps; //未初始化的指针,有效,但风险高
“没有所谓的null reference“意味使用references可能会比使用pointers更富效率。这是因为使用reference之前不需要测试其有效性:
void printDouble(const double& rd)
{
cout<<rd;//不需要测试rd,它一定代表某个double
}
如果使用pointers,通常就得测试它是否为null
void printDouble(const double *pd)
{
if(pd){ //检查是否为null pointer
cout<<rd;//不需要测试rd,它一定代表某个double
}
}
Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象:
string s1("Nancy");
string s2("Clancy");
string& rs=s1; //rs代表s1
string *ps= &s1; //ps指向s1
cout<<rs<<endl; //输出Nancy
cout<<*ps<<endl; //输出Nancy
rs=s2; //rs仍然代表s1,但是s1的值现在变成了"Clancy"
cout<<s1<<endl; //输出Clancy
ps=&s2; //ps现在指向s2,s1没有变化
cout<<s1<<endl; //输出Clancy
cout<<*ps<<endl; //输出Clancy
一般而言,当考虑“不指向任何对象”的可能性或是考虑“在不同时间指向不同对象”的能力时,应该采用pointer。而当你确定“总是会代表某个对象”,而且“一旦代表了该对象就不能够再改变”,那么应该选用reference。
最后,书中下了一个结论:
当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointer达成,你就应该选择reference。任何其他时候,请采用pointers。