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