随笔-1  评论-0  文章-0  trackbacks-0

笔试总是考到的一个题目:
请指出指针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)
cout<<*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.

posted on 2008-10-20 23:49 sunny 阅读(189) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理