1.reference一定得代表某个对象,即reference必须有初值;而point没有这种要求,因此它可以有null pointers。即:
pointer可以为空,但是reference 不能为空。
- 如果你的变量可能为空,那么你应该将其设计为pointer而不是refrence。反之,如果你的变量不能取空值,那么你应该将其设计为reference。
- reference既然不能为空,也就必须在定义的时候,它就必须被给予一个合理的值。而指针可以为空。
int a = 10;
int *p; //合法
int& r; //非法
int& r = a; //合法
以下行为要避免:
int *p = null;
int& r = *p;
- 在reference和pointer都可以使用情况下,使用reference更安全。因为reference不能为空,所以在使用之前不需要判断其值是否为空。
2.没有所谓的null reference意味着references可能会比使用pointers更有效率,因为使用reference之前不需要测试其有效性。
3.pointer可以被重新赋值,指向另外一个对象,而reference却总是指向它最初获得的那个对象,类似于常量指针。
即:
pointer所指的对象可以改变,但是reference所指的对象始终不变(通过reference修改的值,最终都会修改reference所引用的那个对象的值)。
- 如果你所设计的变量在不同时刻需要指向不同的对象,那么需要将其设计为pointer。反之,可以设计为reference因为使用更安全。
string s1("hello");
string s2("world");
string& rString = s1; //rString引用的是s1对象
string *pString = &s2; //pString指向s2对象
rString = s2; //此处只是将s1的值修改为world,即将s2的值赋给s1;
pString = &s1; //此处pString将指向s1对象