簡體   English   中英

如何正確重載postfix增量運算符?

[英]How to properly overload postfix increment operator?

有沒有辦法修改此代碼,以便在編譯時不會收到警告? 此外,這個代碼可能不會導致段錯誤,因為它將訪問的內存檢索在運算符函數調用結束時取消分配的main中的x值?

class A {

  int x; /* value to be post-incremented */

  public:

  A() {  /* default constructor */
  }

  A( A & toCopy ) {   /* copy constructor */
    x = toCopy.x;
  }

  A & operator++(int) {  /* returns a reference to A */

    A copy( *this );         /* allocate a copy on the stack */
    ++x;

    return copy;            /* PROBLEM: returning copy results in a warning */

  }                         /* memory for copy gets deallocated */

}; /* end of class A */

int main() {

  A object;
  object.x = 5;

  cout << (object++).x << endl;   /* Possible segfault ? */

}

您需要返回一個值(不是引用):

A operator++(int) { /*...*/ }

這將解決編譯器警告,你不會得到一個懸空引用。

后綴運算符不通過引用返回,按值返回:

A operator++(int) {  /* returns a copy */

    A copy( *this );         /* allocate a copy on the stack */
    ++x;

    return copy;

  } 

請注意,在您的代碼中,您將返回對局部變量的引用,該變量具有未定義的行為

另外還要注意,返回副本可以easilly編譯器通過省略掉NRVO (即代碼它相當NRVO友好 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM