Правильный способ перегрузки двоичной операции - PullRequest
1 голос
/ 09 апреля 2019

Я новичок в C ++, так что, пожалуйста, будьте осторожны со мной :) Я нашел два разных способа перегрузить бинарный оператор в C ++.

Первый (из книги «Объектно-ориентированное программирование на C ++», Роберт Лафоре):

class Distance
{
private:
    int value;

public:
    Distance() : value(0) {}
    Distance(int v) :value(v) {}

    Distance operator+(Distance) const;
};

Distance Distance::operator+(Distance d2) const
{
    return Distance(value+d2.value);
}

И еще один, с использованием функций друга (из Интернета)

class Distance
{
private:
    int value;

public:
    Distance() : value(0) {}
    Distance(int v) :value(v) {}

    friend const Distance operator+(const Distance& left, const Distance& right);
};

const Distance operator+(const Distance& left, const Distance& right)
{
    return Distance(left.value + right.value);
}

Все эти случаи позволяют написать следующий код следующим образом:

Distance d1(11);
Distance d2(5);
Distance d3 = d1 + d2;

Мой вопрос: в чем основное отличие этих случаев?Может быть, какие-то преимущества или недостатки.Или какие-то "хорошие манеры программирования"?

Заранее благодарим за мудрость!:)

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Существует несколько тонких различий, в том числе:

Путь без членства позволяет иметь оба значения

42 + Distance(42);
Distance(42) + 42;

, тогда как путь участника допускает только

Distance(42) + 42;
2 голосов
/ 09 апреля 2019

Distance может быть конвертировано из int неявно. Тогда второй стиль позволяет использовать opeartor+ с объектом Distance, используемым в качестве правого операнда.

Distance d1(11);
Distance d2(5);
Distance d3 = d1 + d2; //fine
Distance d4 = d1 + 5;  //fine
Distance d5 = 5 + d1;  //fine

1-й стиль поддерживает использование opeartor+ только с объектом Distance, используемым в качестве левого операнда. т.е.

Distance d1(11);
Distance d2(5);
Distance d3 = d1 + d2; //fine
Distance d4 = d1 + 5;  //fine
Distance d5 = 5 + d1;  //fail
...