时间: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[]总是返回一个引用。
----------------------------------------------------------------------------------
三、总结
当你知道需要指向某个东西而且也绝不会改变指向其他东西时,或者重载某个操作符其语法无法用指针完成时,选择用引用。其他情况还是采用指针吧。