C ++ оператор приращения - PullRequest
10 голосов
/ 06 мая 2010

Как отличить перегрузку 2-х версий оператора ++?

const T& operator ++(const T& rhs)

какой?

i++;
++i;

Ответы [ 4 ]

11 голосов
/ 06 мая 2010

Для версий, не являющихся членами, функция с одним параметром является префиксом, а функция с двумя параметрами, а второй * int - постфиксом:

struct X {};
X& operator++(X&);      // prefix
X  operator++(X&, int); // postfix

Для версий-членов версия с нулевым параметром является префиксом, а версия с одним параметром, принимающая int, - это постфикс:

struct X {
    X& operator++();    // prefix
    X  operator++(int); // postfix
};

Параметр int для вызовов операторов постфикса будет иметь значение ноль.

10 голосов
/ 06 мая 2010

Эти операторы унарные, т.е. они не принимают параметр правой части.

Что касается вашего вопроса, если вам действительно необходимо перегрузить эти операторы, для преинкремента используйте подпись const T& operator ++(), а для постинкремента - const T& operator(int). Параметр int является фиктивным.

3 голосов
/ 06 мая 2010

для операторов postfix ++ и - функция должна принимать фиктивный аргумент int. если он не имеет аргумента, то это префиксный оператор

2 голосов
/ 06 мая 2010

Думайте о приращении постфикса i++ как о наличии второго (отсутствующего) параметра (то есть i++x).Таким образом, подпись приращения постфикса имеет правый параметр, а приращение префикса - нет.

...