引用还是指针

在C++中,变量有着两种存在形式:引用与指针。

引用与指针在使用方式上完全不同,但它们的功能都是一样的。都是用来间接引用其他对象。

为了更清晰在什么场合下更适合使用引用或是指针,以下做一个整理:

首先,引用不同于指针,不能指向空引用。这也就是说,引用必须指向某个对象。由这一点,我们可以知道,当所指向的对象可能有空引用的情况出现时,就必须使用指针,而当对象永远都不可能称为空引用时,才可以使用引用。

其次,引用在定义的时候必须对其初始化,而指针没有这样的限制。所以当存在有不同初始化可能的时候应用使用指针,而不能使用引用。但这点也意味着引用的代码效率要比指针高,因为使用指针之前,必须对指针进行合法性验证,否则会出现对空指针进行操作的错误。

另外,引用所指向的对象一旦初始化之后就不能再改变指向的对象,而指针也没有这样的一个限制。因此以下的代码中引用与指针所做的事情是有本质上的不同

string s1("Nancy");
string s2("Clancy");
string& rs = s1;
string * ps = &s1;
rs = s2;
ps = &s2;

需要注意的是,rs = s2ps = &s2 这两条语句看似一样,但是所执行的操作却根本不同。rs = s2rs 在初始化时指向 s1 变量,由于引用不能改变指向的对象,那么 rs = s1 实际上是将 s2 的值赋给 rs ,也就是将 r2 的值赋值给 r1r1 成了 Clancy

最后一种情况是出现在操作符重载的时候。例如重载操作符`[]`。出于语义易懂的目的,操作符返回引用更符合正常逻辑。

小结一下,在以下情况下,应该使用指针:

  1. 有可能指向空引用的情况。
  2. 需要延迟初始化。
  3. 需要改变所指向的对象。

特别指出,操作符重载应该返回引用。