70

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

私が理解しているのは、呼び出し中に関数に引数を渡している間です。

void myFunction(type myVariable)
{
}

void main()
{
    myFunction(myVariable);
}

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

しかし、myVariableが配列の場合は、開始アドレスのみが渡されます (この関数は値による呼び出し関数ですが)。

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

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

4

5 に答える 5

63

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

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

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

于 2014-01-19T10:14:20.847 に答える
21

C++ では常に選択肢があります。すべての型T(配列を除く。以下を参照) は、パラメーターを type にすることで値渡しできT、パラメーター typeT &を reference-to- にすることで参照で渡すことができますT

パラメーターの型が明示的に参照であることを示す注釈が付けられていない場合 ( type &myVariable)、特定の型に関係なく、常に値によって渡されます。ユーザー定義型の場合も (コピー コンストラクターはそのためのものです)。ポインターの場合も、ポインターをコピーしてもポイントされているものはコピーされません。

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

于 2014-01-19T10:18:06.643 に答える
7

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 のように参照渡しパラダイムを自分で実装します。指定されたアドレスのデータを変更すると、呼び出し元関数のオブジェクトが正確に変更されるためです。

于 2014-01-19T10:22:07.090 に答える
-7

C++ は、ポインター (int*) または参照 (int&) ではない引数を値で渡します。呼び出された関数で呼び出しブロックの var を変更することはできません。配列はポインタです。

于 2014-01-19T10:17:52.573 に答える