c にはオーバーロードできない演算子が 5 つあります: "?:"、"."、"::"、"sizeof"、".*"。 「.」および「::」演算子がオーバーロードされている場合、混乱が発生する可能性があります。「sizeof」演算子は、多くのポインターが内部的に依存しているためオーバーロードできません。「.*」演算子はクラス メンバーへのポインターを参照します。
このチュートリアルの動作環境: Windows 7 システム、C 17 バージョン、Dell G3 コンピューター。
C にはオーバーロードできない演算子が 5 つあります: "?:" "." "::" "sizeof" ".*"。
オーバーロード: 構文を変更する代わりに、演算子に新しいセマンティクスを許可します。そうしないと、混乱が生じます。
オーバーロードに関する部分的な規則: 操作関数の少なくとも 1 つのパラメーターは、クラスのオブジェクト、またはクラスのオブジェクトへの参照である必要があります。
これらの演算子をオーバーロードできない理由を以下で説明します。
(1)?:
オーバーロードできると仮定して、次のコードを見てみましょう:
exp1 ? exp2 : exp3
この演算子の意味は、exp2 を実行することです。および exp3 それらの 1 つがオーバーロードされた場合、1 つ、2 つ、またはどちらも実行されないという保証はなく、演算子のジャンプ プロパティは存在しなくなります。したがって、「?:」をオーバーロードすることはできません。
(2).
オーバーロードできると仮定して、オブジェクトを作成し、そのオブジェクトの関数を呼び出す状況を想定できます。
class Y{ public: void fun(); }; class X{ public: Y* p; Y& operator.(){ return *p; } void fun(); } void g(X& x){ x.fun(); }
この例では、x.fun() はどの fun 関数が呼び出されるのかを知りません。
「.」演算子の意味はオブジェクトのメンバーを参照することですが、オーバーロードされた後はこれが保証されなくなり、演算子の意味について混乱が生じます。
(3)::
この演算子はコンパイル中にドメインが解析されるだけであり、操作には関与しません。オーバーロード ルールによれば、演算子がオーバーロードされると、新しいセマンティクスが与えられ、混乱が生じる可能性があります。
(4) sizeof
をオーバーロードできない理由は、主に、多くの内部ポインターが sizeof に依存しているためです。
(5).*
クラス メンバーへの参照ポインター
拡張情報:
オーバーロード操作の原則演算子は次の条件に従います。
1. オーバーロードされた演算子を他のシンボルに接続して新しい演算子を作成することはできません。
2. オーバーロードされた演算子には、クラス型または列挙型のオペランドが必要です。
3. 整数加算 ( ) などの組み込み型演算子の意味は変更できません。
4. オーバーロードされた演算子は、演算子の順序を保証できません。
5. クラス メンバーのオーバーロードされた関数には、仮パラメーターに暗黙的にデフォルトの this ポインターが含まれています。
6. 一般に、代入演算子はメンバー関数として定義され、算術演算子は非メンバー関数として定義されます。
7. 演算子が非クラスのメンバー関数として定義されている場合、それは通常、クラスのフレンドとして定義されます。
8. == と != はペアで指定する必要があります。
9. 添字演算子 []: 非 const メンバーの場合は参照を返し、const メンバーの場合は参照を返します。
10. * および -> 演算子はパラメータを表示しません。
11. プレフィックス /-- は、インクリメントまたはデクリメントされる参照を返さなければなりません。
12. 入力演算子と出力演算子は、クラスのフレンド関数として定義する必要があります。
プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !
以上がC++ でオーバーロードできない演算子は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。