Перегрузка операторов в C ++ - PullRequest
0 голосов
/ 09 марта 2011

Итак, я нахожусь в базовом классе программирования II. Мы должны создать программу, которая выполняет 4 разные функции, которые изменят способ работы оператора. Я просмотрел несколько примеров и наборов текста, которые показывают, как это сделать, но я не могу понять, что означает какой-либо код. Для меня что-то вроде этого должно работать.

int operator++()
{
    variableA--;
}

Для меня это говорит, что если вы столкнулись с ++, то из переменной, теперь очевидно, что она не работает так. Все примеры, которые я нашел, создают свой собственный тип данных. Есть ли способ перегрузить оператора, используя int или double?

Ответы [ 3 ]

6 голосов
/ 09 марта 2011

Все примеры создают свой собственный тип данных, поскольку это одно из правил перегрузки операторов: Перегруженный оператор должен работать хотя бы с одним определяемым пользователем типом .

Даже если бы вы могли перегрузить ++ для целых чисел, компилятор не знал бы, какой из них использовать - вашу версию или обычную версию; это было бы неоднозначно.

Вы, похоже, думаете об операторах как об отдельных функциях, но каждая перегрузка - это совершенно отдельная функция, различающаяся сигнатурой функции (типом и иногда числом аргументов), но с одним и тем же символом оператора (это определение «перегрузки» ).

Итак, вы не можете перегружать ++, чтобы всегда делать что-то другое; это действительно переопределение операторов, которое 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, но мог бы быть определен внутри (вместо этого они получат доступ к закрытым членам), хотя их реализации будут немного другими.

1 голос
/ 09 марта 2011

Вы не можете перегружать операторы встроенных типов.(Ну, технически вы можете перегружать такие вещи, как «int + MyClass» - но не тогда, когда обе стороны являются встроенными типами)

0 голосов
/ 09 марта 2011
...