重複の可能性:
C++でのポインター変数と参照変数の違い
変数をポインタとして宣言するのか、参照によって渡されるオブジェクトとして宣言するのはいつですか?それらはアセンブリで(少なくとも実行時に漸近的に)同じものにコンパイルされるので、いつどちらを使用する必要がありますか?
void foo(obj* param)
void foo(obj& param)
重複の可能性:
C++でのポインター変数と参照変数の違い
変数をポインタとして宣言するのか、参照によって渡されるオブジェクトとして宣言するのはいつですか?それらはアセンブリで(少なくとも実行時に漸近的に)同じものにコンパイルされるので、いつどちらを使用する必要がありますか?
void foo(obj* param)
void foo(obj& param)
私のルールは単純です: 値がオプションであり、したがって 0 になる可能性があることを示したい場合は * を使用します。
ルールから除外する: 周りのすべての _obj_s はコンテナーに格納されており、foo(*value);
代わりにどこでも使用してコードを醜く見せたくありませfoo(value);
んassert(value);
。
私にとって最も理にかなっているGoogle スタイル ガイド標準に従います。それは述べています:
関数パラメーター リスト内では、すべての参照が const でなければなりません。
void Foo(const string &in, string *out);
実際、入力引数は値または const 参照であり、出力引数はポインターであるというのは、Google コードの非常に強力な規則です。入力パラメーターは const ポインターの場合がありますが、非 const 参照パラメーターは許可されません。
入力パラメーターを const ポインターにしたい場合の 1 つは、引数がコピーされないことを強調したい場合です。通常、これもコメントで文書化するのが最善です。bind2nd や mem_fun などの STL アダプターは参照パラメーターを許可しないため、これらの場合もポインター パラメーターを使用して関数を宣言する必要があります。
NULL
ポインターを使用する理由の 1 つは、関数に値を渡すことが理にかなっている場合です。ポインターを使用すると、これを実行できることが期待されます。参照では、これを実行できるとは想定されていません。
(ただし、トリッキーなことを行うことで、参照パラメーターに NULL を渡すことは依然として可能です。この場合、呼び出された関数がクラッシュすることが予想されます。)
もう 1 つの規則は、関数にポインターを渡す場合、関数はそのポインターを使用してオブジェクトの所有権を取得する可能性があることです (特に、COM のような参照カウント環境では)。参照を渡すと、呼び出された関数は、関数呼び出しの間オブジェクトを使用することを期待できますが、後で使用するためにオブジェクトへのポインターを保持することはできません。
ポインターと参照のその他の違いは、参照をコンストラクターに渡さない限り、参照を保持しないことが暗示されていることです。ポインタを渡すということは、複合パターン オブジェクトのように、オブジェクトがそのポインタをしばらく保持する可能性があることを意味する場合があります。
C ++アプリケーションで参照ではなくポインターを使用する理由は、読みやすさです。ポインターを使用すると、実際に何が起こっているかがわかります。ポインターを使用すると、構文によって実際に何が起こっているかがわかります。
「0」または「NULL」についても同様です。私は「NULL」を使用することを好みます。この方法では、3か月後に次のようなコードが表示されます。
somevar_1 = 0;
somevar_2 = NULL;
私はそれsomevar_1
がint
(またはfloat
)でsomevar_2
あり、ある種のポインタであることを知っています。