オーバーロードされた演算子は、特定のことを行うための優れた方法である可能性がありますが、ひどく悪用されやすいです。
<<
and演算子をオーバーロードすると>>
、新しい種類のストリーム、I/O 用の新しいオブジェクト、およびその両方で、C++ のストリームを簡単に拡張できます。オーバーロード->
により、スマート ポインターはほとんど C++ ポインターの完全な代替品になります。オーバーロードされた演算子を使用すると、文字列連結演算子を使用したり、構文的に s に似た新しい種類の数値を作成したりできint
ます。それらを使用すると、他の言語では言語レベルの変更が必要になるようなことをライブラリで実行できるようになります。
彼らには限界があります。累乗に適した演算子はありません。乗算演算子は 1 つしかなく、複数の乗算方法がある場合もあります (たとえば、3D ベクトルの場合、少なくとも内積と外積があります)。、&&
、||
およびコンマ演算子は、短絡評価とシーケンス ポイントを持つことができないため、組み込み機能を複製できません。
そしてもちろん、それらは悪用される可能性があります。たとえば、算術演算子が算術のように機能する必要があるなど、言語の要件はありません。誰かが直感的だと思った SQL 表記法を考え出すために、恐ろしいことが行われているのを見てきました。よく書かれていない C++ プログラムでは、 が何をするのかを知ることはa = x * y;
不可能a.operator=(x.operator*(y));
ですa.operator=(operator*(x, y));
。
C++ の設計における Bjarne Stroustrup の意図は、乱用の可能性に関係なく有用な機能を含めることでしたが、Java の設計における James Gosling の意図は、多少有用であっても過度に悪用される機能を除外することでした。これらの哲学のどちらが正しいか正しくないかは私には明らかではありませんが、それらは異なります。
Java は、演算子のオーバーロード、多重継承、実行時の型推定など、通常 C++ の機能を必要とする状況を回避するように設計されているため、見落とされることはあまりありません。これが良いか悪いか、どちらでもないかは、私にはわかりません。
学生に教える限り、演算子自体をオーバーロードしないように (ファンクターや代入演算子などの定義された条件下を除いて)、ライブラリがオーバーロードされた演算子をどのように使用するかを指摘してください。私は C++ の学生がそれらを正しく行うとは信じていません。あなたがクラスでそれを禁止したので、彼らはそれが難しいことを知っているでしょう. ステートメントよりも複雑なもので私が絶対に信頼できないものの中には、for
演算子をオーバーロードする方法を見つけて、とにかく実行するものもありますが、それが人生です。