时间:2014.03.04
地点:基地一楼
----------------------------------------------------------------------------------
C++程序中指针与引用在很多场合经常用到,许多情形下,它们似乎都可以做相似的事情,那么究竟何时用指针何时用引用,一下一一探究个明白。
----------------------------------------------------------------------------------
首先我们常听说空指针,但没有空引用,null reference是不存在的。也就是说一个引用必须代表某个对象,且一直是这个对象,自它出生一刻起。所以
如果你有一个变量是用来指向或代表一个对象,而且有时你可能还不指向或代表任何对象,那么使用指针,将指针设为null即可。
上面说了,引用打一出生起它就代表了一个具体的对象,也就是说引用必须初始化。
像这样: string& rs; //是错误的,引用没有初始化
像这样: string s("HuNan");
string& rs=s; //是正确的,rs正确地初始化为指向对象s
然而指针却没有这样的限制,我们可以定义一个未初始化的指针,比如:
string* ps; //指针没有初始化,它是有效的,但是有风险,最好别这样用。
没有空引用带来的一个好处是使用引用会比指针效率更高,因为没空引用的情形我们使用引用之前就比使用指针效率更高了。比如:
void PrintDouble(const double& rd){ cout<<rd; //无需测试rd,因为它一定代表了某个double对象 }
void PrintDouble(const double *pd){ if(pd){ //检查是否为空指针 cout<<*pd; } }
总的来说,当你需要考虑有不指向任何对象的可能性时或在不同时间指向不同对象时,一个采用指针。而如果你确定要总是代表某个对象,中途不会变心时就用引用。
使用引用还有一种情况,就是重载操作符比如operator[],该操作或者干脆说该函数必须返回某种类型,这种类型能够被赋值,因为我们有时用到比如 a[3]=5;的语句,
在这里a[3]操作必然是要返回某种类型,该类型可以被赋值,才考虑返回到底是要指针还是引用时,我们来假设一下:假设返回的是指针,那么对这个指针类型赋值的语句应该是这样:
*a[3]=5;
a[3]=5;如此,显然引用非常契合我们的意图。所以重载operator[]总是返回一个引用。
----------------------------------------------------------------------------------
当你知道需要指向某个东西而且也绝不会改变指向其他东西时,或者重载某个操作符其语法无法用指针完成时,选择用引用。其他情况还是采用指针吧。
原文:http://blog.csdn.net/u012333003/article/details/20487735