前インクリメントと後インクリメントの両方のオーバーロード: あいまいさの解決
演算子を C でオーバーロードして、組み込み演算子の機能を拡張できます。ユーザー定義型。一般的な使用例の 1 つは、インクリメント前およびインクリメント後の操作の両方でインクリメント演算子 ( ) をオーバーロードすることです。ただし、あいまいさの問題に遭遇することなくこれを達成するのは困難です。
最初のアプローチ: 同じ戻り値の型
提供されたコード スニペットでは、最初の試行で演算子をオーバーロードします。前インクリメントと後インクリメントの両方で同じ戻り値の型 (int)。ただし、このアプローチは次の理由により失敗します。
解決策: 仮引数によるオーバーロード
このあいまいさを解決するには、後置バージョンの演算子を次のようにオーバーロードします。ダミーの int パラメータ。この変更により、次の 2 つの目標が達成されます:
コード例:
<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 サイトの他の関連記事を参照してください。