指针与引用的区别
《More Effective C++》 Note
指针是C语言就有的,引用是C++新增的,它们似乎有着相同的功能,都可以间接引用其他对象。
指针用"->"和"*"操作符,而引用使用"."操作符"。在任何情况下,都不能使用指向空值的引用,一个引用必须总是指向某些对象。
如果需要使用一个变量并让它指向一个对象,但该变量也在某些时候也可能不指向任何对象,这时应该声明为指针。
char *pc = 0; //设置指针为空值
char& rc = *pc; //让引用指向空值
这样使用结果将是不确定的,应该避免这样使用。因为引用肯定会指向一个对象,所以在C++里,引用应该被初始化。
string& rs; //错误,引用必须被初始化
string s("abcd");
string& rs = s; //正确,rs指向s
//指针没有限制:
string *ps; //合法但危险
不存在指向空值的引用意味着使用引用的代码效率比使用指针要高,因为在使用引用之前不需要测试它的合法性。
void printDouble(const double& rd)
{
std::cout << rd; //无需测试rd,它肯定指向一个double值
}
//指针
void printDouble(const double *pd)
{
if(pd) //检查是否为NULL
{
std::cout << *pd;
}
}
指针与引用的另一个不同是指针可以被重新赋值以指向另一个不同的对象,而引用则总是在初始化时被指定对象,以后不能修改。
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,s1未改变
在以下情况下你应该使用指针:
- 存在不指向任何对象的可能(此时能设置指针为NULL)。
- 需要在不同的时刻指向不同的对象。
在重载某个操作符时,应该使用引用:
vector<int> v(10);
v[5] = 10;
//如果操作符"[]"返回的是一个指针,那么后一个语句就得这样写:
*v[5] = 10; //这样会使v看上去像是一个向量指针
所以,当必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,不应该使用指针。在其它情况下,应该使用指针。