ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目1 ポインタと参照の違い

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 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;

こうしなければならなくなる。

まとめ
基本はポインタを使う。
何か指し示すものがあると分かっていて、かつ、他のものは指し示したくないケースでは参照を使う。