詳解C++編程中一元運算子的重載

來源:互聯網
上載者:User
可重載的一元運算子如下:

  1. !(邏輯 NOT)
  2. &(取址)
  3. ~(二進位反碼)
  4. *(取消指標引用)
  5. +(一元加)
  6. -(一元求反)
  7. ++(遞增)
  8. --(遞減)
  9. 轉換運算子

尾碼遞增和遞減運算子(++ 和 ––)在遞增和遞減中單獨處理,下面會講到。

以下規則適用於所有其他一元運算子。若要將一元運算子函式宣告為非靜態成員,則必須用以下形式聲明它:
ret-type operator op ()
其中 ret-type 是傳回型別,op 是上表中列出的運算子之一。
若要將一元運算子函式宣告為全域函數,則必須用以下形式聲明它:
ret-type operator op (arg )
其中 ret-type 和 op 如上所述用於成員運算子函數,arg 是要參與運算的類類型的參數。
注意
一元運算子的傳回型別沒有限制。例如,邏輯 NOT(!) 返回整數值是合理的,但並非強制性的。

遞增和遞減運算子多載
由於遞增和遞減運算子各有兩個變數,因此它們屬於一個特殊類別:

  • 前置遞增和後置遞增
  • 前置遞減和後置遞減

編寫重載的運算子函數時,為這些運算子的首碼和尾碼版本實現單獨的版本很有用。若要區分這兩者,請遵循以下規則:運算子的首碼形式與聲明任何其他一元運算子的方式完全相同;尾碼形式接受 int 類型的其他參數。

注意
當為遞增或遞減運算子的首碼形式指定重載運算子時,其他參數的類型必須是 int;指定任何其他類型都將產生錯誤。
以下樣本顯示如何為 Point 類定義首碼和尾碼遞增和遞減運算子:

// increment_and_decrement1.cppclass Point{public:  // Declare prefix and postfix increment operators.  Point& operator++();    // Prefix increment operator.  Point operator++(int);   // Postfix increment operator.  // Declare prefix and postfix decrement operators.  Point& operator--();    // Prefix decrement operator.  Point operator--(int);   // Postfix decrement operator.  // Define default constructor.  Point() { _x = _y = 0; }  // Define accessor functions.  int x() { return _x; }  int y() { return _y; }private:  int _x, _y;};// Define prefix increment operator.Point& Point::operator++(){  _x++;  _y++;  return *this;}// Define postfix increment operator.Point Point::operator++(int){  Point temp = *this;  ++*this;  return temp;}// Define prefix decrement operator.Point& Point::operator--(){  _x--;  _y--;  return *this;}// Define postfix decrement operator.Point Point::operator--(int){  Point temp = *this;  --*this;  return temp;}int main(){}

可使用以下函數頭在檔案範圍中(全域)定義同一運算子:

friend Point& operator++( Point& )   // Prefix incrementfriend Point& operator++( Point&, int ) // Postfix incrementfriend Point& operator--( Point& )   // Prefix decrementfriend Point& operator--( Point&, int ) // Postfix decrement

表示遞增或遞減運算子的尾碼形式的 int 類型的參數不常用於傳遞參數。它通常包含值 0。但是,可按以下方式使用它:

// increment_and_decrement2.cppclass Int{public:  Int &operator++( int n );private:  int _i;};Int& Int::operator++( int n ){  if( n != 0 )  // Handle case where an argument is passed.    _i += n;  else    _i++;    // Handle case where no argument is passed.  return *this;}int main(){  Int i;  i.operator++( 25 ); // Increment by 25.}

除顯式調用之外,沒有針對使用遞增或遞減運算子來傳遞這些值的文法,如前面的代碼所示。實現此功能的更直接的方法是重載加法/賦值運算子 (+=)。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.