Все примеры создают свой собственный тип данных, поскольку это одно из правил перегрузки операторов: Перегруженный оператор должен работать хотя бы с одним определяемым пользователем типом .
Даже если бы вы могли перегрузить ++
для целых чисел, компилятор не знал бы, какой из них использовать - вашу версию или обычную версию; это было бы неоднозначно.
Вы, похоже, думаете об операторах как об отдельных функциях, но каждая перегрузка - это совершенно отдельная функция, различающаяся сигнатурой функции (типом и иногда числом аргументов), но с одним и тем же символом оператора (это определение «перегрузки» ).
Итак, вы не можете перегружать ++
, чтобы всегда делать что-то другое; это действительно переопределение операторов, которое C ++ не позволяет.
Вы можете определить ++
для типа, который вы создали:
class MyType {
public:
int value;
};
MyType const& operator++(MyType& m) { // Prefix
++m.value;
return m;
}
const MyType operator++(MyType& m, int) { // Postfix (the 'int' is just to differentiate it from the prefix version)
MyType temp = m;
++m.value;
return temp;
}
int main() {
MyType m;
m.value = 0;
m++; // Not m.value++
cout << m.value; // Prints 1
}
Обратите внимание, что этот набор ++
операторов был определен вне класса MyType, но мог бы быть определен внутри (вместо этого они получат доступ к закрытым членам), хотя их реализации будут немного другими.