*」と「.*」。"/> *」と「.*」。">

ホームページ  >  記事  >  バックエンド開発  >  オーバーロードできない C++ 演算子はどれですか?

オーバーロードできない C++ 演算子はどれですか?

青灯夜游
青灯夜游オリジナル
2020-12-21 15:20:1514344ブラウズ

C オーバーロードできない演算子は次のとおりです: 1. 条件演算子 "?:"; 2. メンバー アクセス演算子 "."; 3. ドメイン演算子 "::"; 4. 長さ演算演算子 "sizeof"; 5. メンバ ポインタ アクセス演算子「->*」および「.*」。

オーバーロードできない C++ 演算子はどれですか?

関連する推奨事項: 「C ビデオ チュートリアル

オーバーロード: 演算子が変更するのではなく、新しいセマンティクスを持つことができるようにします。構文が異なるため、混乱が生じます。

オーバーロードのルールの一部: 操作関数の少なくとも 1 つのパラメーターは、クラスのオブジェクト、またはクラスのオブジェクトへの参照である必要があります。

C にはオーバーロードできない演算子が 5 つあります:

  • "?:" (条件演算子)

  • "."(メンバーアクセス演算子)

  • "::"(フィールド演算子)

  • "sizeof"(長さ演算子)

  • #"->*" と ".*" (メンバー ポインター アクセス演算子)

これらの演算子をオーバーロードできないのはなぜですか?理由の概要:

(1)“?:”

オーバーロードできると仮定して、次のコードを見てみましょう:

exp1 ? exp2 : exp3

この演算子の意味は、exp2 と exp3 のいずれかを実行することです。オーバーロードされている場合、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)"->*" および ".*"

クラス メンバーへの参照ポインタ

プログラミング関連の知識については、

プログラミング入門をご覧ください。 !

以上がオーバーロードできない C++ 演算子はどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。