More Effective C++ 項目1 ポインタと参照の違い
新訂版 More Effective C++ (AddisonーWesley professional co)
- 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/06/29
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 129回
- この商品を含むブログ (43件) を見る
C++を結構忘れてきたから、積ん読だったMore Effective C++を少しずつ読むことにした。
ブログの趣旨とズレるかもしれないが、AndroidでもnativeなどでC++は使われているのでよしとする。
項目1 ポインタと参照の違い
null参照は存在しない。参照は必ず何かのオブジェクトを指し示す。
char* pc = 0; char& rc = *pc; // こうして無理やりnull参照を作れるけど、禁止。結果は不定。
null参照はないので、参照は初期化が必須。
string s("asdf");
string& rs = s;
ポインタよりも参照が効果的な例として、null参照がないので、チェックを省略できる。
void print(const double& rd) { cout << rd; }
ポインタの場合は有効性のチェックが必要。
void print(const double* pd) { if (pd) { cout << *pd; } }
ポインタは指し示す先を変更できるが、参照は常に初期化時のオブジェクトを指し続ける。
何も指し示さないケースがある場合はポインタ、一度指し示したらその後変更することがなければ参照。
以下のような代入ができるように、operator [ ]は参照を返すようにすること。
vector<int> v(10); v[5] = 10;
operator [ ]がポインタを返すと
*v[5] = 10;
こうしなければならなくなる。
まとめ
基本はポインタを使う。
何か指し示すものがあると分かっていて、かつ、他のものは指し示したくないケースでは参照を使う。