web-dev-qa-db-ja.com

C ++はオブジェクトを値または参照で渡しますか?

ここで答えが見つからなかった簡単な質問。

私が理解しているのは、呼び出し中に関数に引数を渡す間、例えば.

void myFunction(type myVariable)
{
}

void main()
{
    myFunction(myVariable);
}

intfloatなどの単純なデータ型の場合、関数は値によって呼び出されます。

ただし、myVariableが配列の場合、開始アドレスのみが渡されます(関数が値関数による呼び出しであっても)。

myVariableがオブジェクトの場合、コピーを作成して渡すのではなく、オブジェクトのアドレスのみが渡されます。

質問に戻りましょう。 C++はオブジェクトを参照または値で渡しますか?

45
user3041058

関数のシグネチャで特に指定されていない限り、引数は値で渡されます。

  • void foo(type arg)では、argが単純型、ポインター型、またはクラス型であるかどうかに関係なく、typeは値によって渡されます。
  • void foo(type& arg)では、argは参照によって渡されます。

配列の場合、渡される値は配列の最初の要素へのポインターです。コンパイル時に配列のサイズがわかっている場合は、参照によって配列を渡すこともできます:void foo(type (&arg)[10])

37
Oswald

C++は常に選択肢を提供します:AllT(配列を除く、以下を参照)は、パラメータ型を作成することにより、値で渡すことができますT、およびパラメータータイプを_T &_、reference-to -Tにすることで参照渡し。

パラメータータイプが参照(_type &myVariable_)として明示的に注釈されていない場合、特定のタイプに関係なく値によって渡されるalwaysです。ユーザー定義型についても(コピーコンストラクターの目的です)。ポインターについても、ポインターをコピーしても、ポイントされているものはコピーされません。

配列はもう少し複雑です。配列を値で渡すことはできません。parameter _int arr[]_のような型は、実際には_int *arr_の単なる異なる構文です。これは、配列からポインターを生成する関数に渡す行為ではなく、ほぼすべての可能な操作(sizeofのような少数の操作のみを除く) does that です。 1つのcanは配列への参照を渡しますが、これは参照として明示的に注釈が付けられます:int (&myArray)[100](アンパサンドに注意してください)。

16
user395760

C++は、値渡しと参照渡しパラダイムの両方を可能にします。

以下に2つの使用例を示します。

http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

配列は特別な構成体です。配列をパラメーターとして渡すと、最初の要素のアドレスへのポインターが、配列内の要素の型とともに値として渡されます。

ポインターをパラメーターとして渡した場合、Cのように参照渡しのパラダイムを自分で実装します。指定したアドレスのオブジェクトを変更すると、呼び出し元関数のオブジェクトを正確に変更するためです。

4
mcvkr

C++では、クラス、構造体、または共用体として宣言された型は、「クラス型の」と見なされます。これらは値で渡されるか、コピーコンストラクタを使用してコピーが関数に渡されると言うことができます。これは、バイナリツリーに実装されている再帰ツリー関数にNode * *タイプのparamがほとんど常に存在する)バイナリツリーを実装する場合、非常に明白です。これは、そのノードの変更を容易にするためです。ノードがそのまま渡される場合(つまり、ポインタ型ではない場合)、ノードへの変更はローカルコピーに対して行われます。ベクトルの場合でも、ベクトルのコピーを渡す際に関数に渡されます。参照&を使用することを避けるため。

0
Piyush Kundnani