-
指针指向了一个对象的地址,引用是给一个对象起别名。
-
指针传入一个函数后得先判空,但引用不需要。不存在空绑定,但存在空指针。
-
指针可以被重新赋值指向另一个不同对象,但是引用总是指向在初始化时被指定的对象,以后不能改变。
-
个人认为一个函数中,如果涉及传入参数的修改,那么最好把这个被修改值设计成指针接口,因为这样在下游调用函数时,就知道哪个参数会被修改,代码可读性更好。如果传入参数不希望被修改,则设计成const引用。例如
class A {}; // 使用引用作为接口 void Foo1(const A& a1, A& a2); // 使用指针作为接口 void Foo2(const A& a1, A* a2); // 下游调用 A a1; A a2; Foo1(a1, a2); // 不确定哪个参数会被修改 Foo2(a1, &a2); // 确定a2会被修改
-
涉及型别推导时,例如模板推导或auto推导的情况,指针会被推导出指针型别,并保留cv特性。但引用只会被推导成值型别,且不保留cv特性。例如
const double& a = 1.; const double* ap = &a; auto bp = ap; // bp会被推导成const double* auto b = a; // b会被推导成double
-
一些惯用语境下,例如重载
[]
操作符,重载=
操作符,在返回类型时应该使用引用,而不使用指针。这些语境下使用指针返回会令人误解,降低代码可读性。
持续补充…