相同:
指针与引用看上去完全不同,但是它们似乎有相同的功能,它们都是间接的引用其他的对象。
区别:
1):引用必须总是指向某些对象;而指针可以不指向任何对象。(如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用 )
2):引用必须被初始化;而指针可以不被初始化。例如下面的例子
string &str; // 错误,引用必须被初始化
string s("abcd");
string &str = s; // 正确,str 指向s
string *ps; // 合法,但是危险。
3):引用在初始化被赋值指定对象后,就不能再次被重新赋值以指向另外一个对象;而指针可以。例如下面的例子:
string s1("Jimmy");
string s2("star");
string &rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs仍旧引用s1,但是s1的值现在是“star”
ps = &s2; // ps现在指向s2,s1没有改变。
效率上来说,引用的效率比使用指针的要高,因为在使用引用之前不需要测试它的合法性。
总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在
这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这
种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会
改变指向,那么你应该使用引用。
还有一种情况,就是当你重载某个操作符时,你应该使用引用。
建议:
当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必
要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。