首頁 > 後端開發 > C++ > 主體

如何在 C 語言中重載前增量和後增量的增量運算子 ( ) ?

Barbara Streisand
發布: 2024-11-02 22:38:03
原創
429 人瀏覽過

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

前增量和後增量的重載:解決歧義

可以在C 中重載運算符,以擴展內置運算符符的功能使用者定義的類型。常見的用例是為預增量和後增量操作重載增量運算子 ( )。然而,在不遇到歧義問題的情況下實現這一目標是一個挑戰。

初始方法:相同的返回類型

在提供的程式碼片段中,初始嘗試使用以下運算子重載了運算子預增量和後增量的返回類型(int) 相同。然而,這種方法由於以下原因而失敗:

  • 基於返回類型的函數重載:
    C 不允許僅基於返回類型的函數重載。雖然不同的參數類型可以區分重載,但僅有不同的返回類型是不夠的。
  • 重載解析中的歧義:
    呼叫 SampleObject 時,編譯器無法確定要使用哪個重載使用因為兩者返回相同的類型。這種歧義會導致編譯時錯誤。

解決方案:使用虛擬參數重載

為了解決這個歧義,後綴版本的運算子被重載為一個虛擬 int 參數。此修改實現了兩個目標:

  • 區分後綴重載:
    虛擬參數為後綴重載提供唯一的簽名,將其與前綴重載區分開來。
  • 保留遞增邏輯:
    前綴重載保持不變,遞增當前實例並傳回對其的參考。後綴重載建立目前實例的暫存副本,對其進行遞增,並傳回遞增之前的值。

程式碼範例:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板