答えて

1

号になり、これら二つは完全に無関係です。

浅いコピー/ディープコピーは、オブジェクトコピーについてです。;一方、値渡し/参照渡しは、変数のの受け渡しについて話しています。

多くの現代の言語では、あなたが最もよく知っていると言われているように、「オブジェクト」は言語内の値ではないため、「オブジェクト」を割り当てたり渡すことはできません。むしろ、オブジェクトはオブジェクト(参照)へのポインタによって常に操作されます。オブジェクト(参照)は値であり、割り当てまたは渡すことができます。

PythonとJavaは、値渡しのみです。参照を渡すと、ポインタがコピーされ、同じオブジェクトへのポインタが2つあります。オブジェクトのコピーは行われません。これらの言語では、オブジェクトのコピーは代入や渡しではなく、.clone()のような特殊なメソッドを呼び出すか、オブジェクトをコンストラクタに渡して新しいオブジェクトを作成することで行います。

C++のようないくつかの言語がありますが、オブジェクトは値になることができます(もちろん、オブジェクトへのポインタを持つこともできますが、これは参照と同様に動作します)。他の言語で)。 Cには、値渡しと参照渡しの両方があります。参照でオブジェクトを渡すと、コピーは行われません。オブジェクトを値で割り当てまたは渡すと、オブジェクトがコピーされます。しかし、デフォルトではこれは浅いコピーです。

シャローコピーとディープコピーの区別は、オブジェクトの別のオブジェクトへのポインタであるオブジェクトのメンバーを処理する方法です。ポインタではないメンバーは単純にコピーされます。 「浅い」または「深い」という概念はありません。 「浅い」または「深い」は、指し示されたオブジェクトをコピーするかどうかにかかわらず、ポインタであるメンバについてのみ話す。 C++のデフォルトの代入演算子とコピーコンストラクタは、単に各メンバをコピーします。ポインタであるメンバの場合は、ポインタがコピーされ、したがって同じオブジェクトへのポインタが2つあることを意味します。それは浅いコピーです。

他のオブジェクトへのポインタであるメンバが実際にあなたのオブジェクトの実際の「一部」である「サブオブジェクト」を指している場合(「別のオブジェクトへのポインタオブジェクトはサブオブジェクトを意味するかどうかはオブジェクトのデザインに依存します)、複数のオブジェクトが同じサブオブジェクトを指していることを望まないので、メインオブジェクトをコピーするときにサブオブジェクトをコピーしたいのですオブジェクト。これをC++で実装するには、カスタム代入演算子とカスタムコピーコンストラクタを実装して、コピー中の「サブオブジェクト」をコピーする必要があります。他の言語では、同様に使用されるコピー方法をカスタマイズする必要があります。

-1

はい、値渡しするディープコピーを作成し、参照渡しが浅いコピーを

関連する問題