8

重複の可能性:
C++ でオブジェクトを関数に渡す方法は?
値ではなく const 参照で渡すのはなぜですか?

C++には、値渡しよりも参照渡しを使用する必要がある、または少なくとも選択する必要がある場合の一種のルールまたはガイダンスがありますか?

そして、あるオブジェクトのサイズがオブジェクトのサイズとほぼ同じである場合 (正直なところほとんどありません)、判断が難しくなる可能性があります。

4

4 に答える 4

7

引数への変更を関数の外部に表示したい場合は、常に参照を渡す必要があります。これは非const参照によるパスであり、ほとんどの場合、効率ではなくロジックによって動機付けられます。

constレジスタのサイズよりも大きいサイズのデータ​​型を扱う場合は、(ほとんどの場合)参照を渡す必要があります。参照はほとんどconstであるため、変更を加えることはできません。したがって、これは効率性によって動機付けられます。

于 2012-12-19T07:54:34.177 に答える
3
  1. オブジェクトのコピーコンストラクターを呼び出さない場合(たとえば、オブジェクトのサイズが原因で呼び出される場合)。
  2. 値だけでなく、実際に参照が必要な場合(swap(a,b)たとえば、スワップを作成するために実際に元の参照が必要なため)。
于 2012-12-19T07:54:50.717 に答える
3

通常、次の状況では参照渡しを使用します。

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);
于 2012-12-19T08:00:36.363 に答える
1

を優先pass-by-reference-to-constpass-by-valueます。オブジェクトのコピーはコピーコストラクタによって生成されるため、値渡しはコストのかかる操作です。また、クラスに非プリミティブデータメンバー(例:)があるstd::string場合、クラスの新しいオブジェクトが作成されるたびに、それらのstd::stringオブジェクトも作成されます。

参照による受け渡しも回避しslicing problemます。派生クラスオブジェクトを値で基本クラスオブジェクトを期待する関数に渡すと、派生クラスの派生機能が切り取られ、関数内のオブジェクトが基本クラスオブジェクトとして動作します。参照で渡すと、スライスを回避できます。

とはいえ、参考にできない場合もあります。関数の引数または戻り値にNULL値が必要な場合は、参照を使用できません。

于 2012-12-19T08:15:23.270 に答える