ホームページ > バックエンド開発 > C++ > C で前インクリメントと後インクリメントの両方のインクリメント演算子 ( ) をオーバーロードするにはどうすればよいですか?

C で前インクリメントと後インクリメントの両方のインクリメント演算子 ( ) をオーバーロードするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-02 22:38:03
オリジナル
483 人が閲覧しました

 How to Overload the Increment Operator (  ) for Both Pre and Post-Increment in C  ?

前インクリメントと後インクリメントの両方のオーバーロード: あいまいさの解決

演算子を C でオーバーロードして、組み込み演算子の機能を拡張できます。ユーザー定義型。一般的な使用例の 1 つは、インクリメント前およびインクリメント後の操作の両方でインクリメント演算子 ( ) をオーバーロードすることです。ただし、あいまいさの問題に遭遇することなくこれを達成するのは困難です。

最初のアプローチ: 同じ戻り値の型

提供されたコード スニペットでは、最初の試行で演算子をオーバーロードします。前インクリメントと後インクリメントの両方で同じ戻り値の型 (int)。ただし、このアプローチは次の理由により失敗します。

  • 戻り値の型に基づく関数のオーバーロード:
    C では、戻り値の型のみに基づいた関数のオーバーロードは許可されていません。引数の型を変えることでオーバーロードを区別できますが、戻り値の型が異なるだけでは十分ではありません。
  • オーバーロード解決のあいまいさ:
    SampleObject を呼び出すとき、コンパイラはどのオーバーロードを実行するかを決定できません。どちらも同じ型を返すので使用します。このあいまいさにより、コンパイル時エラーが発生します。

解決策: 仮引数によるオーバーロード

このあいまいさを解決するには、後置バージョンの演算子を次のようにオーバーロードします。ダミーの int パラメータ。この変更により、次の 2 つの目標が達成されます:

  • 後置オーバーロードの区別:
    ダミー パラメーターは後置オーバーロードに一意の署名を提供し、接頭辞オーバーロードと区別します。
  • インクリメント ロジックの保持:
    プレフィックス オーバーロードは変更されず、現在のインスタンスをインクリメントし、そのインスタンスへの参照を返します。 postfix オーバーロードは、現在のインスタンスの一時コピーを作成し、それをインクリメントし、インクリメント前の値を返します。

コード例:

<code class="cpp">#include <iostream>

class CSample {
 public:
  int m_iValue;     // just to directly fetch inside main()
  CSample() : m_iValue(0) {}
  CSample(int val) : m_iValue(val) {}

  // Overloading ++ for Pre-Increment
  CSample& operator++() {
    ++m_iValue;
    return *this;
  }

  // Overloading ++ for Post-Increment
  CSample operator++(int) {
    CSample tmp(*this);
    operator++(); // prefix-increment this instance
    return tmp;   // return value before increment
  }
};

int main() {
  CSample obj1(5);
  std::cout << obj1.m_iValue << std::endl; // Output: 5

  // Pre-Increment
  ++obj1;
  std::cout << obj1.m_iValue << std::endl; // Output: 6

  // Post-Increment
  CSample obj2 = obj1++;
  std::cout << obj2.m_iValue << std::endl; // Output: 6
  std::cout << obj1.m_iValue << std::endl; // Output: 7

  return 0;
}</code>
ログイン後にコピー

後置バージョンのダミー引数を使用して演算子をオーバーロードすることで、曖昧さを効果的に解決し、C のカスタム型の事前インクリメント動作と事後インクリメント動作の両方を有効にします。

以上がC で前インクリメントと後インクリメントの両方のインクリメント演算子 ( ) をオーバーロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート