Переопределение оператора — когда использовать друга?

Мне интересно, почему переопределение оператора () не может быть «другом» (и поэтому ему нужен дополнительный параметр «this»), а оператор + должен быть другом, как в следующем примере:

class fnobj
{
int operator()(int i);
friend int operator+(fnobj& e);
};

int fnobj::operator()(int i)
{

}

int operator+(fnobj& e)
{

}

Я понял, что оператор + должен быть другом, чтобы избежать «дополнительного» дополнительного этот параметр, но почему оператору () это не нужно?

2

Решение

Вы перегружены унарный плюс оператор. И вы, вероятно, не хотели этого делать. Он не добавляет два объекта, он описывает, как интерпретировать один объект, когда + появляется перед ним, так же, как int x = +10 будет интерпретироваться. (Это интерпретируется так же, как int x = 10)

Для оператор сложения, неверно, что «оператор + должен быть другом».

Вот два способа добавить два fnobj объекты:

int operator+(fnobj& e);
friend int operator+(fnobj& left, fnobj& right);

В первом классе this Предполагается, что объект слева от +, Таким образом, обе формы эффективно принимают два параметра.

Итак, чтобы ответить на ваш вопрос, вместо того, чтобы думать, что «operator () не нужен friend«, рассмотрите это как» operator () требует this«Или, что еще лучше,« для обработки объекта как функции требуется объект ».

4

Другие решения

Вы не поняли это правильно (и не правильно используете это).

В C ++ есть два способа определить бинарный оператор для класса, либо как функцию-член

class A
{
public:
int operator+ (A const& other);
};

или как бесплатная функция

class A {};

int operator+ (A const& lhs, A const& rhs);

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

2

По вопросам рекламы [email protected]