На днях у меня возникли проблемы, когда я попытался перегрузить двухпараметрический оператор с помощью функции-члена класса. Я пробовал ссылки, но ничего не изменилось. Компилятор сказал, что я не могу написать функцию-член, которая принимает более одного аргумента того же типа, что и сам класс. Это почему?
Вот код:
class Fraction
{
public:
Fraction(int num=1, int den=1): numerator(num), denominator(den) {}
Fraction(const Fraction& r): numerator(r.numerator), denominator(r.denominator) {}
Fraction& operator=(const Fraction&);
Fraction& operator*(const Fraction&, const Fraction&);
private:
int numerator, denominator;
};
Fraction& Fraction::operator=(const Fraction& r)
{
numerator = r.numerator;
denominator = r.denominator;
return *this;
}
Fraction Fraction::operator*(const Fraction& x, const Fraction& y)
{
Fraction z(x.numerator*y.numerator, x.denominator*y.denominator);
return z;
}
Ниже приведено сообщение об ошибке от компилятора:
Fraction& Fraction::operator*(const Fraction&, const Fraction&)' must take either zero or one argument
Во-первых, проблема, которую вы наблюдаете, не имеет абсолютно никакого отношения к функциям-членам в целом. Функции-члены обычно могут принимать произвольное количество аргументов типа «того же класса». В вашем примере вы можете объявить
class Fraction
{
void foo(Fraction &f1, Fraction &f2, Fraction &f3, Fraction &f4) {}
...
};
без проблем. Таким образом, не ясно, почему вы решили сформулировать свой вопрос так, как будто он касается функций-членов в целом.
Во-вторых, в вашем коде речь идет о том простом факте, что вы пытаетесь перегрузить оператор. Синтаксис оператора в C ++ фиксирован для большинства (но не для всех) операторов. Это сразу означает, что те операторы, чей синтаксис является фиксированным, будут иметь фиксированное количество параметров.
В вашем примере это оператор *
, Он может быть одинарным (один параметр) или двоичным (два параметра). Когда вы перегружаете этот оператор функцией-членом, уже подразумевается один параметр, поэтому вы можете добавить только ноль или один дополнительный параметр (для одинарного *
и двоичный *
соответственно). Вы, с другой стороны, пытаетесь добавить два больше параметров в дополнение к неявному. То есть вы пытаетесь определить троичный оператор *
, Это невозможно. Там нет троичного *
оператор в C ++. И это именно то, что говорит вам компилятор.
Операторы принимают фиксированное количество аргументов, например, оператор +, поскольку оператор сложения принимает ровно 2 параметра. Если это функция-член, то подразумевается, что первая (самая левая) этот и второй передается в качестве параметра.
Как будет выглядеть оператор +, который принимает три параметра? Можно представить, что это будет выглядеть 3 + 4 + 5 но это эквивалент вызова оператора + (3,4), а затем оператора + (7,5).
Список операторов и количество аргументов, которые они принимают, можно найти в википедии: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Для получения более подробной информации есть еще одна публикация StackOverflow, в которой подробно рассказывается: Перегрузка оператора