値またはポインターまたは参照を選択する方法は?
C++ でコーディングするとき、それぞれをいつ選択すればよいか明確なアイデアがありません。
選択する際の優先順位やルールは 1 つですか?
You use a value when
You use pointers or references when
You decide between a pointer and a reference using a simple rule: if there are situations where your referenced object does not exist, or the same variable must refer to different objects throughout its lifetime, use a pointer; otherwise, use a reference.
他の人が私を修正するためだけに、私は試してみます:
本当にnullにできず、保存したくない場合、およびプリミティブでない場合は、参照を使用してください。変更する必要がない場合は、const 参照を使用してください。
それ以外の場合は、変更または保存する必要がある場合は、ポインターを使用します (より良い: スマート ポインター)。プリミティブでない場合は、const
ポインターを使用します。
ランタイム ポリモーフィズムが必要な場合は、値渡しを使用してはなりません。
それ以外の場合は、値渡しを使用します。使用int
しておりませんconst int&
。
テンプレートを作成している場合は、値による受け渡し (または何らかの方法でのコピー) が、型の制約として機能するコピー コンストラクターを意味することを覚えておいてください。型が配列 (または文字列リテラル) の場合、参照はおかしく動作する可能性があります。
任意の T から派生した型の選択に関して、良い習慣だと思うことを簡単にまとめます。
template <typename _T>
void CALLED (_T B) { /* _STUFF_ */ }
template <typename T>
void CALLER (void)
{
T A;
typedef T TYPE;
CALLED<TYPE>(A);
}
TYPE は次のいずれかです。
T
(値の型)、T&
(参照)、T
const & (const T への参照)、T*
(ポインター)、T const *
(const T へのポインター)、T const * const
(const T への const ポインター)、T * const
(非定数 T への定数ポインタ)注: ポインター型の場合、call ステートメントは に変わりCALLED<TYPE>(&A);
ます。
CALLED()
有効なオブジェクトを持つことを意図している場合これはどういうわけか「デフォルト」であるべきです。
A(^) | 保存することを保証します。いいえ | はい | はい | はい | B希望の変更 | はい | はい | いいえ | いいえ | sizeof(T) > sizeof(T*) | はい/いいえ | はい/いいえ | はい | いいえ | -------------------------------------------------- ----------------------- タイプ (B の) | T& | T | T | T 定数 & | T 定数 |
(^): この行の「いいえ」は、意図的に A を変更したいという意味でもあります。これが当てはまらない場合、 A の保存が保証されることを示す最適な型を示します。
CALLED()
有効なオブジェクトを取得するかどうかを表すことができる (および表す)場合参照を NULL にバインドするのはあまりスマートではなく、値パラメーターは常にオブジェクトを取得しようとするため、ここではポインターに固執する必要があります。ここでは値による呼び出しはあまり意味がないため、T のサイズは関係ありません。
A(=*B) を保存する保証 | いいえ | はい | はい | いいえ | Bの変更 | いいえ | いいえ | はい | はい | -------------------------------------------------- ---------------------------------- タイプ | T* 定数 | T 定数 * 定数 | T 定数 * | T* |