ここで答えが見つからなかった簡単な質問。
私が理解しているのは、呼び出し中に関数に引数を渡す間、例えば.
void myFunction(type myVariable)
{
}
void main()
{
myFunction(myVariable);
}
int
、float
などの単純なデータ型の場合、関数は値によって呼び出されます。
ただし、myVariable
が配列の場合、開始アドレスのみが渡されます(関数が値関数による呼び出しであっても)。
myVariable
がオブジェクトの場合、コピーを作成して渡すのではなく、オブジェクトのアドレスのみが渡されます。
質問に戻りましょう。 C++はオブジェクトを参照または値で渡しますか?
関数のシグネチャで特に指定されていない限り、引数は値で渡されます。
void foo(type arg)
では、arg
が単純型、ポインター型、またはクラス型であるかどうかに関係なく、type
は値によって渡されます。void foo(type& arg)
では、arg
は参照によって渡されます。配列の場合、渡される値は配列の最初の要素へのポインターです。コンパイル時に配列のサイズがわかっている場合は、参照によって配列を渡すこともできます:void foo(type (&arg)[10])
。
C++は常に選択肢を提供します:All型T
(配列を除く、以下を参照)は、パラメータ型を作成することにより、値で渡すことができますT
、およびパラメータータイプを_T &
_、reference-to -T
にすることで参照渡し。
パラメータータイプが参照(_type &myVariable
_)として明示的に注釈されていない場合、特定のタイプに関係なく値によって渡されるalwaysです。ユーザー定義型についても(コピーコンストラクターの目的です)。ポインターについても、ポインターをコピーしても、ポイントされているものはコピーされません。
配列はもう少し複雑です。配列を値で渡すことはできません。parameter _int arr[]
_のような型は、実際には_int *arr
_の単なる異なる構文です。これは、配列からポインターを生成する関数に渡す行為ではなく、ほぼすべての可能な操作(sizeof
のような少数の操作のみを除く) does that です。 1つのcanは配列への参照を渡しますが、これは参照として明示的に注釈が付けられます:int (&myArray)[100]
(アンパサンドに注意してください)。
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のように参照渡しのパラダイムを自分で実装します。指定したアドレスのオブジェクトを変更すると、呼び出し元関数のオブジェクトを正確に変更するためです。
C++では、クラス、構造体、または共用体として宣言された型は、「クラス型の」と見なされます。これらは値で渡されるか、コピーコンストラクタを使用してコピーが関数に渡されると言うことができます。これは、バイナリツリーに実装されている再帰ツリー関数にNode * *タイプのparamがほとんど常に存在する)バイナリツリーを実装する場合、非常に明白です。これは、そのノードの変更を容易にするためです。ノードがそのまま渡される場合(つまり、ポインタ型ではない場合)、ノードへの変更はローカルコピーに対して行われます。ベクトルの場合でも、ベクトルのコピーを渡す際に関数に渡されます。参照&を使用することを避けるため。