Оператор перегрузки ++ - PullRequest
3 голосов
/ 06 января 2012

Объявление класса:

class unaryOperators 
{
    public:
        int i;

        unaryOperators (int tempI = 0)
        {
            i = tempI;
        }

        unaryOperators operator++ (int);
        unaryOperators operator++ ();
};

Соответствует ли это глобальное определение постфиксной или префиксной версии перегруженного оператора ++?Почему?

unaryOperators operator++ (unaryOperators &one)
{   
    return one; 
}

Ответы [ 6 ]

7 голосов
/ 06 января 2012
unaryOperators& operator++ (unaryOperators &one)
              ^^

- унарный оператор приращения, не являющийся членом префикса.

Оператор унарного постфикса, не являющийся членом, принимает дополнительный int в качестве параметра применения политики.

unaryOperators operator++ (unaryOperators &one, int)

Ссылка:

C ++ 03 Стандарт 13.5.7 Увеличение и уменьшение [больше.inc]

Пользовательская функция под названием operator ++ реализует оператор префикса и постфикса ++. Если эта функция является функцией-членом без параметров или не-функцией с одним параметром класса или типа перечисления, она определяет оператор приращения префикса ++ для объектов этого типа. Если функция является функцией-членом с одним параметром (which shall be of type int) или не-функцией с двумя параметрами (the second of which shall be of type int), она определяет оператор приращения постфикса ++ для объектов этого типа . Когда приращение постфикса вызывается в результате использования оператора ++, аргумент int будет иметь значение ноль.125)

[Example:
class X {
   public:
      X& operator++(); // prefix ++a
      X operator++(int); // postfix a++
};
class Y { };
Y& operator++(Y&); // prefix ++b
Y operator++(Y&, int); // postfix b++

void f(X a, Y b) {
++a; // a.operator++();
a++; // a.operator++(0);
++b; // operator++(b);
b++; // operator++(b, 0);
a.operator++(); // explicit call: like ++a;
a.operator++(0); // explicit call: like a++;
operator++(b); //explicit call: like ++b;
operator++(b, 0); // explicit call: like b++;
}
—end example]
2 голосов
/ 06 января 2012

Каждый оператор (который может быть перегружен как свободная функция) получает еще один аргумент при перегрузке как свободная функция. Первый аргумент соответствует *this при перегрузке в качестве функции-члена.

bool AsMember::operator!() const;
bool operator!(const AsFreeFunction&);

bool AsMember::operator==(const AsMember& rhv) const;
bool operator==(const AsFreeFunction& lhv, const AsFreeFunction& rhv);

etc.

Оператор приращения не является исключением из этого.

2 голосов
/ 06 января 2012

Я думаю , это поможет вам.

1 голос
/ 06 января 2012

Функции глобального перегруженного оператора ++ ожидают явного указания всех аргументов, поэтому, если перегруженный оператор ++ имеет значение постфикс , мы должны добавить один аргумент int по умолчанию ( для различенияпостфиксная версия с префиксом ) в дополнение к обязательному (который определяет тип, к которому должна применяться функция) .

unaryOperators operator++ (unaryOperators &one, int dummy)
{   
    return one; 
}

В случаеиз префикса функций глобального перегруженного оператора ++, единственный аргумент, который нам нужно указать, является обязательным (который определяет тип, к которому должна применяться функция) .

unaryOperators operator++ (unaryOperators &one)
{   
    return one; 
}
0 голосов
/ 06 января 2012

Каноническая версия преинкремента:

T &operator++(T &)

То есть возвращает операнд по ссылке.Постинкремент занимает неиспользованный int, поэтому глобальный operator++, который вы определили, является оператором преинкремента.

0 голосов
/ 06 января 2012

Свободная функция является префиксом, поскольку в ней отсутствует параметр int.

Полезное руководство для подписей операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...