条款1:仔细区别pointers和references

**
印象笔记:
本文描述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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值