3

下付き文字演算子をオーバーロードする必要があるシナリオは何ですか?

そして、assert関数はこれと何の関係がありますか?添え字のオーバーロードのassertの使用のほとんどの場合、それについての説明が必要になると思います。

4

6 に答える 6

7

[]要素にアクセスするための構文的/意味的に明確な方法を提供するために、カスタムコンテナで演算子をオーバーロードする場合があります。

たとえばmy_container[3] = 9;my_container.set(3, 9);

もちろん、[]本質的に何でもするためにをオーバーロードすることはできますが、おそらくそうすべきではありません。たとえば、 3my_object[3]ずつインクリメントmy_objectさせることができますが、意味的には、[]演算子はインデックスによるルックアップを伝達します。インターフェイスを期待どおりにすることをお勧めします。

assert迅速で汚い境界チェックに使用できます。それはあなたのプログラムを乱雑に死に至らしめるでしょう、それは微妙なメモリの破損を導入するよりも常に好ましいです。利点はassert、本番コードからコンパイルできるマクロであるということです。つまり、コードを変更せずに本番環境ではなく開発中のコンテナをチェックするという、境界のオーバーヘッドを支払うことができます。

于 2011-03-30T14:26:07.143 に答える
3

演算(インデックス(単一フィールドによるインデックス)が設定されたベクトル(位置によるインデックス)またはマップ(キーによるインデックス)の場合のように、クラスのオーバーロードを検討operator[]します。複数の次元がある場合は、インデックスを作成する場合は、単一の引数operator()を取るので、別の演算子()を使用するのが理にかなっている場合があります。おそらく、演算子のオーバーロードoperator[]に関するC ++FAQliteエントリを読む必要があります。

一般に、 (または他の演算子)assertとは無関係です。は、実行時に操作のいくつかの前提条件が満たされていることを判断する方法であり、不変条件の一部が壊れていることを検出したときに、すばやく失敗し、激しく失敗するために使用する必要があります。operator[]assert

于 2011-03-30T14:26:48.833 に答える
1

Assertは、インデックス作成演算子operator[] 自体とはまったく関係がありません

アサートは、デバッグビルドの前提条件/不変条件をチェックするために使用されるため、これらの違反は本番環境に移行する前にトラップされます。

インデックス演算子は、ある種index out of rangeの状況になりがちです。これは、他の場所よりも頻繁にそれらに気づいているように見える理由を説明している可能性があります。基本的に、すべてのパラメーター化された関数で少なくとも1回、クラスごとに数回assertを使用します(不変条件のチェック)。

HTH

于 2011-03-30T14:38:03.350 に答える
1

これに関する私の限られた知識で、クラスが一連の要素を保持している状況で言うことができます。たとえば、ベクトル/文字列。アサートについては、このサイトをチェックしてください。 - リンク -

于 2011-03-30T14:25:12.207 に答える
1

operator[] コレクションまたはコレクションのラッパーであるクラスを実装している場合、オーバーロードする可能性があります。私にとってはoperator[]、操作が一定時間またはほぼ一定時間で実行できる場合にのみオーバーロードします。これは、配列のインデックス付けが実行される方法だからです。これを使用してハッシュ テーブルの値を検索することは理にかなっているかもしれませんが、リンクされたリストにインデックスを付けることはできません。

assertsの実装で使用されている場合はoperator[]、インデックス引数がコレクションの範囲内にあることを強制する可能性があります。これは、IMO の誤った使用法ですassert。なぜならassert、間違った方法でプログラムを呼び出すのではなく、内部プログラミング エラーをキャッチするために使用する必要があるからです。エンド ユーザーまたはクライアント アプリケーションにアサーション エラーが表示されることはありません。もう 1 つの可能性は、このクラスが内部でのみ使用されることです。この場合、アサーション エラーは、クライアントによって渡された間違った引数ではなく、内部プログラミング エラーを明らかにします。

于 2011-03-30T15:14:15.787 に答える
0

インデックスの範囲を変更したい場合(たとえば、0からではなく1からインデックスを作成したい場合)、または1次元配列で高次元配列を表現したい場合がありますか?

于 2011-03-30T14:26:15.030 に答える