JavaとC++の間の演算子のオーバーロードを比較する場合、new
とdelete
については言及しません。Javaでは、新しいメモリ管理の詳細が十分に公開されていないため、削除する必要はありません。
他の演算子をポインタ型にオーバーロードすることはできません。少なくとも1つの引数はクラスまたは列挙型でなければならないため、ポインタに対して異なる演算子を提供することについては言及できません。
C++の演算子は、値または値のconst参照を処理します。
オペレータがvalueまたはconstの値を参照することによって、値以外のものが返されることは非常に珍しいことです。
すべてのC++関数に共通の明白なエラーは別として、スタックに割り当てられたオブジェクトへの参照を返す(メモリリークの反対)か、値ではなくnew
で作成されたオブジェクトへの参照を返します通常、学習する前にキャリアで一度も行われていない)、一般的な演算子が記憶上の問題を抱えているシナリオを思いつくのは難しいでしょう。
したがって、オペランドが通常の使用パターンに基づいてスタックまたはヒープに割り当てられているかどうかによって、複数のバージョンを作成する必要はありません。
オペレータへの引数は、値または参照として渡されるオブジェクトです。 C++には、オブジェクトがヒープまたはスタックに割り当てられたかどうかをテストするための移植可能なメカニズムはありません。オブジェクトが値渡しされた場合は、常にスタックに格納されます。したがって、2つのケースの演算子の振る舞いを変更する必要がある場合は、C++で移植可能ではありません。 (多くのOSでは、オブジェクトへのポインタがスタックに通常使用されているスペースにあるのか、通常はヒープに使用されているスペースにあるのかをテストできますが、ポータブルでも信頼できるものでもありません。 2つのポインタを引数として取ったので、オブジェクトがポインタであるためにヒープが割り当てられていると信じる理由はありません
唯一の重複は、演算子[ ]ここで、同じ演算子はアクセサーとミューテータの両方として使用されます。 constと非constバージョンを持つことは普通です。したがって、受信者がconstでない場合は値を設定できます。これは良いことです - 定数としてマークされているオブジェクト(公開されている状態)を変更することはできません。
私はC++で作業していません。しかし、演算子をオーバーロードすると、新しい値を返す必要があります(単純な値の場合はスタックに、複雑な型の場合はヒープ上にある可能性があります)。ペルソナ;人* b;人* c = a + b; – shahkalpesh