指针与引用区别

笔试总是考到的一个题目:
请指出指针pointer 与引用referece 的区别,每次都是都说西说感觉总是没有回答完成,所以这儿来总结一下,当然不是我自己总结的。引用侯捷的《more effective C++》
答案如下:

 

pointers 和 refereces区别

1、references没有所谓的NULL references.如果你有一个变量,其目的是用来指向另一个对象,但是也可能它不指向任何对象,那么就应该设为pointer。
poiner 可以是null类型。

string *pc=0;char &rc=*pc;

结果无可预知。

 

2、referece 一定得代表某个对象,C++因此要求referece必须有初值
string &rs;  //错误,引用必须被初始化

string s("xyzxy");

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

而Pointer 就没有限制:
sting *ps; 未初始化的指针,有效,但风险高

 

3、referece 比pointer更复用效率,这是因为使用refereces之前不需测试其有效性:

void printDouble(const double &rd)
{

cout<<rd; //无需测试是否为null;
}
void printDouble(const double *pd)

{
if(pd)
<<*pd; 

}

 

 

4、pointer 可以被重新赋值,指向另一个对象。 references 却总是指向它最初获得的那个对象;   

string s1("Nancy"); 

string s2("Clancy");

 string &rs=s1;    rs指向s1;

 string *ps= &s1;  ps指向s1;
 rs=s2;          

  rs仍然代表s1;但是s1的值已经变化,变为s2的值了。        
   ps=&s2;           ps指向s2;s1没有变化

 

如果考虑不指向任何对象的可能性时,或者考虑在不同的时间指向不同的对象的能力时,就应该使用pinter;当你确定总会代表某个对象,而且一旦代表了某个对象不能改变时,就应该选用reference.

 

 

5、当你实现某个操作符的时候,最常见的例子就是operator[].这个操作符很特别地返回某种【被当作assignment赋值对象】的东西;vector<int> v<10>;

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

如果operator【】返回pointer,则上述的最后一句话就是*v[5]=10; 这使得v好像是个以指针形成的vector,事实上不是。所以必须总是令operator[]返回一个reference。

 

结论:当你知道你需要指向某个东西,并且绝不会改变指向其他的东西,或者当你实现一个操作符而其语法需求无法由pointer达成,那么你就应该用referece 其他的所有的情况都用pointers.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值