2

値またはポインターまたは参照を選択する方法は?

C++ でコーディングするとき、それぞれをいつ選択すればよいか明確なアイデアがありません。

選択する際の優先順位やルールは 1 つですか?

4

3 に答える 3

6

You use a value when

  • Your data member is principal, i.e. not a copy of something else or a reference to another value
  • You would like an independent copy that you would like to modify
  • The object is much smaller than the pointer/reference, and you need many of them

You use pointers or references when

  • The object is too large to copy efficiently
  • The object needs to be modifiable in some other part of the code

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.

于 2013-05-16T01:17:09.503 に答える
1

他の人が私を修正するためだけに、私は試してみます:

本当にnullにできず、保存したくない場合、およびプリミティブでない場合は、参照を使用してください。変更する必要がない場合は、const 参照を使用してください。

それ以外の場合は、変更または保存する必要がある場合は、ポインターを使用します (より良い: スマート ポインター)。プリミティブでない場合は、constポインターを使用します。

ランタイム ポリモーフィズムが必要な場合は、値渡しを使用してはなりません。

それ以外の場合は、値渡しを使用します。使用intしておりませんconst int&

テンプレートを作成している場合は、値による受け渡し (または何らかの方法でのコピー) が、型の制約として機能するコピー コンストラクターを意味することを覚えておいてください。型が配列 (または文字列リテラル) の場合、参照はおかしく動作する可能性があります。

于 2013-05-16T01:13:56.977 に答える
0

任意の 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&(参照)、
  • Tconst & (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* |
于 2013-05-16T01:22:03.970 に答える