Если я перегрузил операторы + и =, должен ли я перегружать + =? - PullRequest
3 голосов
/ 17 января 2011

В целом, какие операторы следует перегрузить?Я знаю, что перегруженный += - это хорошо, потому что расширение до a = a + b создает временный объект, тогда как перегруженный += может этого избежать.Будет ли += то есть не перегружен эффективно использовать мои перегруженные операторы?

Ответы [ 8 ]

5 голосов
/ 17 января 2011

Лучший способ реализовать operator+, способствующий повторному использованию кода, это

class Foo
{
    Foo(Foo const&); // Implemented

    Foo& operator+=(Foo const& rhs)
    {
        // Implement all the addition-specific code here
        return *this;
    }
};

, а затем

Foo operator+(Foo x, Foo const& y)
{
    x += y; return x;
}

Если вам нужно сделать копию правой стороны (по причинам, связанным с реализацией, обычно это не так), вы можете передать по значению как operator+=, так и второй аргумент operator+.

5 голосов
/ 17 января 2011

Если вы не перегружаете +=, оно не будет определено;вы не сможете его использовать.

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

Я бы также предложил вам использовать Boost.Operators для перегрузки операторов, которые должны автоматически генерироваться в терминах других.

3 голосов
/ 17 января 2011

Лучше сначала реализовать operator+= и operator=, поскольку реализация operator+ в терминах их тривиальна.IIRC это Скотт Мейерс Эффективный C ++ .

3 голосов
/ 17 января 2011

У вас нет до. Компилятор не выдаст ошибку или предупреждение о том, что вы сделали что-то не так.

Тем не менее, вы действительно должны это делать в подавляющем большинстве случаев. Компилятор НЕ преобразует a += b в a = a + b.

2 голосов
/ 17 января 2011

Да, это другой оператор, поэтому вам придется его перегрузить. Вы можете (и, вероятно, должны) использовать другие операторы (например, '+') внутри перегруженной функции.

1 голос
/ 17 января 2011

Вы должны перегрузить + =.

Затем вы можете перегрузить его, чтобы сделать что-то совершенно другое, но это не рекомендуется.; -).

0 голосов
/ 17 января 2011

Когда вы говорите «должен ли я…», только если вам нужно это использовать. Обычно лучше реализовать оператор + =, а затем реализовать оператор + с точки зрения его, потому что большинство людей неправильно понимают оператор + (не делайте его константным, забудьте вернуть копию ...)

std :: накопить использует a = a + b, и если все, что вы делаете, это пишете что-то, чтобы соответствовать этому, + = не поможет само по себе, хотя вы все равно можете реализовать оператор + с точки зрения этого.

Конечно, вы можете решить, что не хотите, чтобы пользователи могли изменять ваши объекты с помощью + = (тогда как вы не против, чтобы они делали копии).

0 голосов
/ 17 января 2011

Нет, вам не надо. Но только не думайте об этом, потому что вы перегружены + и = у вас есть + = бесплатно. Конечно, вы не предполагаете, что только потому, что вы перегружены - и> у вас также есть -> оператор?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...