1、没有所谓的空引用,但可以有空指针
2、引用必须初始化,指针不一定要初始化
int &a;//错误,没有初始化
int b=1;
int &rb=b;//正确,rb指向b
int *p;//未初始化指针,正确,却风险高
3、没有所谓的空引用==》引用可能比使用指针更高效,因为使用引用前不用测试其有效性
void printDouble(const double& rd)
{
cout<<rd;//不需测试rd,它一定指向某个double
}
void printDouble(const double* pd)
{
if(pd){//测试是否为空指针
cout<<*pd;
}
}
4、指针可以重新赋值,但引用总是指向最初获得的那个对象
string s1("nancy");
string s2("lucy");
string &rs=s1;//rs代表s1
string *ps=&s1;//ps指向s1
rs=s2;//rs仍然代表s1,但s1的值变为lucy
ps=&s2;//现ps指向s2,s1没变
5、其他情况也需使用引用:例operator[],该操作符必须返回能被当做“赋值对象”的东西
vector<int> v(10);//产生一个int vector,大小为10
v[5]=2;//assignment的赋值对象是operator[]的返回值
若operator[]返回值是指针,则应写为:
*v[5]=2;
但这使v看起来像是一个以指针形成的vector,事实不是。为此,总应使operator[]返回引用结论:
选引用:当需要指向某东西,而且绝不会指向其他东西,或实现一个操作符而其语法需求无法有指针达成
选指针:其他任何时候