C++には、値渡しよりも参照渡しを使用する必要がある、または少なくとも選択する必要がある場合の一種のルールまたはガイダンスがありますか?
そして、あるオブジェクトのサイズがオブジェクトのサイズとほぼ同じである場合 (正直なところほとんどありません)、判断が難しくなる可能性があります。
C++には、値渡しよりも参照渡しを使用する必要がある、または少なくとも選択する必要がある場合の一種のルールまたはガイダンスがありますか?
そして、あるオブジェクトのサイズがオブジェクトのサイズとほぼ同じである場合 (正直なところほとんどありません)、判断が難しくなる可能性があります。
引数への変更を関数の外部に表示したい場合は、常に参照を渡す必要があります。これは非const
参照によるパスであり、ほとんどの場合、効率ではなくロジックによって動機付けられます。
const
レジスタのサイズよりも大きいサイズのデータ型を扱う場合は、(ほとんどの場合)参照を渡す必要があります。参照はほとんどconst
であるため、変更を加えることはできません。したがって、これは効率性によって動機付けられます。
swap(a,b)
たとえば、スワップを作成するために実際に元の参照が必要なため)。通常、次の状況では参照渡しを使用します。
1) objetc のサイズがポインターよりも大きい: この場合、objetc を変更したくない場合は、const 参照を使用します。
Reference object;
foo(object);
foo を次のように宣言します。
void foo(const Reference & object);
2)コードを明確にするために、次のようなことを避けようとしています:
int f1 = xxx;
int f2 = yyy;
int f3 = zzz;
....
foo(f1, f2, ............)
構造体を使用する:
struct X
{
int f1;
int f2;
int f3;
....
};
X x;
x.f1 = xxx;
.....
foo(X);
foo は次のように定義されます。
foo(const X & x);
3) 高速化の目的: 関数を呼び出すには、パラメーターをスタックに配置する必要があることに注意してください。 4) 関数内のパラメーターを変更する必要があります。
Reference object;
foo(object);
foo を次のように宣言します。
void foo(Reference & object);
を優先pass-by-reference-to-const
しpass-by-value
ます。オブジェクトのコピーはコピーコストラクタによって生成されるため、値渡しはコストのかかる操作です。また、クラスに非プリミティブデータメンバー(例:)があるstd::string
場合、クラスの新しいオブジェクトが作成されるたびに、それらのstd::string
オブジェクトも作成されます。
参照による受け渡しも回避しslicing problem
ます。派生クラスオブジェクトを値で基本クラスオブジェクトを期待する関数に渡すと、派生クラスの派生機能が切り取られ、関数内のオブジェクトが基本クラスオブジェクトとして動作します。参照で渡すと、スライスを回避できます。
とはいえ、参考にできない場合もあります。関数の引数または戻り値にNULL値が必要な場合は、参照を使用できません。