nullポインタは存在するが、null参照というものは存在しない。参照は常に何らかのオブジェクトを指すため、初期化する必要がある。
//参照の初期化
string& rs; //エラー
string s("xyzzy");
string& rs=s; //OK
//ポインタの初期化 string *ps; //エラーではないが、危険。
//参照はがし char *pc=0; char& rc=pc; //このようにした場合、結果は不定となる。
null参照がないという特徴からポインタよりも参照を用いた方が効果的なこともある。
//ポインタを用いた関数の実装
void printvalue(const int *pi)
{
if(pi) //nullチェックが必要
{
cout << *pi;
}
}
//参照を用いた関数の実装
void printvalue(const int& ri)
{
cout << ri; //nullチェックの必要が無い
}
ポインタは別のオブジェクトを指し示すために再代入される必要がある。これに対して参照は常に初期化されたときのオブジェクトを指し続ける。
string s1("ping");
string s2("pong");
string& rs=s1; //rsはs1を参照
string *ps=&s1;//psはs1を指し示す
rs=s2; //rsはs1を参照するが、s1の値は"pong"
ps=&s2 //ここではpsはs2を指し示すようになる。s1は変更されない
参照は何か指し示すものがあることが分かっている場合や、他のものは指し示したくない場合に選択する機能。それ以外はポインタを使うべきである。