1

私はC++を学んでいて、これに出くわした本を読んでいました:

struct Vector{
   int size;
   double* elem;
}

void vector_init(Vector& v, int s){
   v.size = s;
   v.elem = new double[s];
}

では、ここでvoid vector_init(Vector v, int s)、参照演算子がなければ間違っているでしょうか? &オブジェクト、構造体、配列、またはその他のものをパラメータとして渡しながら、手動で参照渡しする必要がありますか? また、これを行う別の方法はありますか? 言うようにvoid vector_init(Vector *v, int s)

どんな助けでも大歓迎です。

4

3 に答える 3

2

「参照演算子」はありません。

宣言子は&、参照渡しする関数パラメーターにのみ追加されます。参照引数を渡すことは、値渡しと同じように見えます。

于 2013-01-18T04:21:38.817 に答える
1

実際に値を参照( void vector_init(Vector &v, int s)) またはポインター void vector_init(Vector *v, int s)で渡すことは、基本的に同じ意味を持ちます。

主な違いは、参照渡しの場合は有効なパラメーターを渡す必要があり (NULL機能しない)、ポインター渡しの場合は引数を明示的にポインターに変換する必要があることです (参照渡しの場合はこれが自動的に行われます)。 )

voidのように値で何かを渡す場合vector_init(Vector v, int s)は異なります。引数はコピー コンストラクターを介してコピーされ、関数のスコープ内で行われたすべての変更は引数のローカル コピーに対してローカルであり、値渡しで元の引数を変更することはできません。 . あなたは実際に変数を渡しているのではなく、そのコピーを渡しています。

これは、引数が大きなクラスまたは構造体であるか、高価なコピー コンストラクターを持っている場合にも、パフォーマンスの問題が発生する可能性があることを意味します。

于 2013-01-18T04:29:03.393 に答える
1

void vector_init(Vector v, int s)参照演算子なしでは間違っているでしょうか?

v参照渡しをしないvと、関数に入ったときにのコピーがvector_init作成され、そのコピーを操作します。返品後vector_init、その一時コピーは破棄されるためvector_init、オリジナルには影響しませんv。original を操作するには、参照v渡しする必要がありvます(他のタイプと同じ)。

また、これを行う別の方法はありますか? 言うようにvoid vector_init(Vector *v, int s)

参照渡しは、ポインター渡しよりも優れた選択肢です。

于 2013-01-18T04:25:42.933 に答える