C++中提供两种间接参考对象:pointers和references。pointers使用“*”和“->”操作符,references则使用“ . ”。
但是什么时候使用哪种方式?通过学习《More Effective C++》的条款1学习总结了以下情况:
(1)一个references必须总代表某个对象,不可能存在null references。所以当你使用一个变量,其目的是用来指向代表另外一个对象,但是也有可能它不指向任何对象。那么你应该使用pointer。因为pointer可以指向null。换个角度,如果该变量始终需要指向一个对象,不可能使其变为null,那么你应该使用reference。
例: char *pc = 'a'; pc = NULL ; //正确,可以改变其值。
char& pc2 = *pc; //该语句表达的是pc2代表空指针的引用!!!!这是有害的行为。C++对此没有明确定义,会导致不可预期的后果!
所以,请记住:永远不再考虑“reference 成为 null”的可能性。
(2)reference一定代表某个对象。C++要求其必须有初值。
例: string & rs; //错误,无初值!
string s("xyz"); string& rs = s;//正确
另外,使用references可能会比使用pointers更具有效率,因为它不用检测为NULL的情况。如果参数值是指针的话,还需要检测指针是否为NULL的情况。
(3)Pionters和references之间另一个重要的差异是,pointers可以被重新赋值,指向另一个对象,reference却总是指向它最初获得的对象。
例: string s1("nacy");
string s2("chancy");
string& rs = s1; //rs为s1的引用
string *ps = &s1; //ps为s1的指针
rs = s2; //rs仍然代表s1,但是现在s1的值现在变成了“chancy”
ps = &s2; //ps现在指向s2,s1没有变化。
书中总结:当你知道你需要指向某个东西,而且绝不会改变指向其他东西。当你实现一个操作符而其语法需求无法通过pointer完成,你就应该选择references。任何其他时候,请采用pointers。