Как перегрузить оператор++ двумя разными способами для постфикса A++ и префикса ++a?
как перегрузить оператор++ двумя разными способами для postfix a++
и префикс ++a
?
5 ответов:
должно выглядеть так:
class Number { public: Number& operator++ () // prefix ++ { // Do work on this. (increment your object here) return *this; } // You want to make the ++ operator work like the standard operators // The simple way to do this is to implement postfix in terms of prefix. // Number operator++ (int) // postfix ++ { Number result(*this); // make a copy for result ++(*this); // Now use the prefix version to do the work return result; // return the copy (the old) value. } };
разница заключается в том, какую подпись вы выбираете для своей перегрузки(ов)
operator ++
.цитируется из соответствующего статья на эту тему В C++ FAQ (туда для более подробной информации):
class Number { public: Number& operator++ (); // prefix ++: no parameter, returns a reference Number operator++ (int); // postfix ++: dummy parameter, returns a value };
П. С.: когда я узнал об этом, все, что я видел изначально, было фиктивным параметром, но разные типы возврата на самом деле более интересны; они могут объяснить, почему
++x
считается более эффективным, чемx++
в общем.
у вас есть два способа перегрузки двух (префикс/постфикс) операторы ++ для типа T:
метод объекта:
Это самый простой способ, используя" общую " идиому ООП.
class T { public : T & operator++() // ++A { // Do increment of "this" value return *this ; } T operator++(int) // A++ { T temp = *this ; // Do increment of "this" value return temp ; } } ;
объект, не являющийся членом функции:
это еще один способ сделать это: пока функции находятся в том же пространстве имен, что и объект, на который они ссылаются, они будут рассматриваться, когда компилятор будет искать fonction для обработки
++t ;
илиt++ ;
код:class T { // etc. } ; T & operator++(T & p_oRight) // ++A { // Do increment of p_oRight value return p_oRight ; } T operator++(T & p_oRight, int) // A++ { T oCopy ; // Copy p_oRight into oCopy // Do increment of p_oRight value return oCopy ; }
важно помнить, что с точки зрения C++ (включая точку зрения компилятора C++) эти функции, не являющиеся членами, по-прежнему являются частью интерфейса T (если они находятся в одном пространстве имен).
есть два потенциальных преимущества нотации функции, не являющейся членом:
- Если вам удастся закодировать их, не делая их другом T, то вы увеличили инкапсуляцию T
- вы можете применить это даже классы или структуры, чей код вам не принадлежит. Это неинтрузивный способ улучшения интерфейса объекта без изменения его объявления.
Я знаю, что уже поздно, но у меня была та же проблема и нашел более простое решение. Не поймите меня неправильно, это то же самое решение в качестве верхнего (опубликовано Мартином Йорком). Это просто немного проще. Чуточку. Вот это:
class Number { public: /*prefix*/ Number& operator++ () { /*Do stuff */ return *this; } /*postfix*/ Number& operator++ (int) { ++(*this); //using the prefix operator from before return *this; } };
вышеуказанное решение немного проще, потому что он не использует временный объект в метод постфикс.