簡體   English   中英

重載前增量和后增量

[英]overloading pre-increment and post-increment

我看到了一個關於實現預增量和后增量的示例,聲稱可以將重載預增量定義為

T& T ::operator++()

並且可以按照預增量來定義和實現過載后增量,如下所述

const T T::operator++(int){
  const T old(*this);
  ++(*this);
  return old;
}

我有兩個問題:

1)“舊”是什么意思?

2)假設++(* this)使用預增量,原始預增量定義沒有參數。 但是,這里有*。

“舊”是什么意思?

該方法是后增量。 返回當前值(“舊值”),然后遞增值(“新值”)。

假設++(* this)使用預增量,而原始預增量定義沒有參數。 但是,這里有*。

*this不是一個論點。 括號不是必需的,它們是為了便於閱讀。
它等同於++*this

1)“old”是“this”在遞增之前所具有的值。 后增量應該返回該值。

2)++(* this)相當於this-> operator ++()

2)假設++(* this)使用預增量,原始預增量定義沒有參數。 但是,這里有*。

++是一元運算符,所以它有一個參數可以。 每當您將運算符作為成員函數重載時,第一個參數就是當前對象。

未使用的int參數只是區分增量前和后增量的黑客,因為operator++可能意味着。 后增量並不真正接受整數*,它只是一種(笨拙的)語言結構。

您還可以將這些運算符重載為自由函數:

struct T
{
    int n;
};

T& operator++(T& t) { ++t.n; return t; }
T operator++(T& t, int) { T old(t); ++t; return old; }

int main()
{
   T a;
   T b = a++;
   ++b;
}

*正常使用情況下。 使用函數調用語法調用運算符時,可以傳遞一個額外的int來區分這兩者:

operator++(a); //calls-preincrement
operator++(b, 1); //calls post-increment

old只是一個變量名(它不是關鍵字,如果那是你想知道的)。 它用於保存操作數的先前值。

暫無
暫無

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

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