Подтвердить что ты не робот

В чем разница между перегрузкой оператора внутри или вне класса?

в С++ я знаю, что есть два способа перегрузки, мы можем перегрузить его внутри (например, класс a) или снаружи (например, класс b). но вопрос в том, есть ли какая-либо разница между этими двумя во время компиляции или времени выполнения или нет?

class a
{
public:
    int x;
    a operator +(a p) // operator is overloaded inside class
    {
        a temp;
        temp.x = x;
        temp.x = p.x;
        return temp;
    }
};

class b
{
public:
    friend b operator +(b,b);
    int x;
};

b operator+(b p1,b p2) // operator is overloaded outside class
{
    p1.x +=p2.x;
    return p1;
}
4b9b3361

Ответ 1

Элемент operator+ требует, чтобы LHS был a. Свободный оператор требует, чтобы LHS или RHS были b, а другая сторона была конвертируемой в b

struct Foo {
    Foo() {}
    Foo(int) {}
    Foo operator+(Foo const & R) { return Foo(); }
};


struct Bar {
    Bar() {}
    Bar(int) {}
};

Bar operator+(Bar const & L, Bar const & R) {
    return Bar();
}


int main() {
    Foo f;
    f+1;  // Will work - the int converts to Foo
    1+f;  // Won't work - no matching operator
    Bar b;
    b+1;  // Will work - the int converts to Bar
    1+b;  // Will work, the int converts to a Bar for use in operator+

}