3

C++には、コピーコンストラクタデストラクタオーバーロード =があり、これらはまとめてコピー コントロールと呼ばれます。

私の質問は次のとおりです。

  1. asまたはas の場合(割り当てなし) 、またはasからのオブジェクトがinの場合に、オブジェクトを初期化するためにcopy constructor使用されます。C#argument initializingreturningfunction C++

  2. オブジェクトを同じ型の別のオブジェクトに割り当てる (初期化しない) と、暗黙的にオーバーロードさ=れた演算子関数が呼び出されますか?

4

4 に答える 4

1

C#には、コピーコンストラクターやオーバーロードの概念はありませんoperator=。C#では、オブジェクトは存在するだけで、コードでそれらのハンドルを使用します。ハンドルは「値で」コピーしてコード全体で使用できますが、これはいわゆる「浅い」コピーであり、オブジェクト自体は同じであり、すべて同じメモリを(間接的に)指します。

コピーコンストラクターは、マネージドワールドでのディープコピーに似ており、を介してそれを実現できますが、ICloneableそれを作成するのは完全に手動であり、オブジェクトの実装次第です。boostまた、シリアル化(方法)または任意の方法の間接的な方法でそれを達成することもできます。

最後のポイントとして、オブジェクトの存続期間は非決定論的であるため(GCが任意に死ぬべきであると決定したときに死ぬ)、デストラクタのようなものもありません。最も近いのは、ファイナライザー(オブジェクトが収集されたときに非決定論的に呼び出される)と、ファイナライズを制御するように見えるIDisposableパターン(と一緒に)です。using言うまでもなく、それらはめったに使用されません。

編集:コピーコンストラクターには同等のものはありませが、「型キャスト」コンストラクターimplicitはありますが、現時点では正確な名前はわかりません。

于 2012-12-13T15:06:52.513 に答える
1
  1. いいえ: 参照オブジェクトは参照によって渡されますが、値オブジェクトはバイトごとにコピーされます。独自の「コピー コンストラクター」を作成できますが、明示的に呼び出す必要があります。
  2. 代入演算子をオーバーロードすることはできません

C# に公平を期すために、基になるガベージ コレクション メモリ モデルにより、C++ コピー コントロールの複雑さは必要ありません。たとえば、オブジェクトをコピーするときに動的に割り当てられたオブジェクトの所有権を制御する必要はありません。これは、動的オブジェクトへの参照を必要な数だけ自由に持つことができるためです。

于 2012-12-13T15:02:22.913 に答える
1

C# では、代入演算子をオーバーロードできません。

デストラクタは、管理されたメモリの世界では意味がありません (ほとんどの場合)。実際には同等のもの (ファイナライザー) がありますが、それらを使用する必要はほとんどありません。

コピー コンストラクターは特定のクラスに対して作成されますが、C++ ほど頻繁には行われません。言語によって暗黙的に呼び出されることはなく、手動で呼び出した場合にのみ使用されます。

于 2012-12-13T15:01:21.837 に答える