引用区别于指针的一个首要特点就是不存在null reference,一个引用必然代表一个对象。
char *pc=0;
char& rc=*pc;
上面这种形式在C++中属于未定义行为。
引用初始化后将一直代表初始化时的对象,无法更改。而指针可以在使用中更改指向的对象,也可以指向null。因而在使用中无需检验引用的有效性,而需要对指针进行检测是否为null后才能解指针。
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
基于上面的差异,当代表的对象不会更改时(不是指对象的值),应该选用引用;而当希望指向不同对象甚至null时,应该使用指针。
还有一种常见的情况需要使用引用:operator[]。这个操作符需要返回能被赋值的对象,也就是左值变量,一般返回引用。
结论:
当你知道你需要指向某个对象,而且绝不会改变指向其他对象,或是当实现一个操作符而语法需求无法由指针实现,就选用引用。其他情况采用指针。