Можно ли использовать перегруженный оператор для реализации другой перегрузки оператора?

Например, если я перегрузил оператор +

myClass & operator + (const myClass & rhs)

а также перегружен = оператор

myClass & operator = (const myClass & rhs)

оба оператора работают нормально. Могу ли я использовать этот перегруженный оператор в своей перегрузке оператора +=?

myClass & operator += (const myClass & rhs){

*this = *this + progA;

return *this;

}

Приведенный выше код работает нормально. Я просто хочу знать, является ли это хорошей практикой написания кода, или мне следует повторно использовать код из двух предыдущих реализаций для перегрузки оператора +=.


person Mykel    schedule 04.04.2018    source источник
comment
На самом деле это обычная практика. Хорошее эмпирическое правило — избегать дублирования кода, когда это возможно. Хотя по моему опыту вы, скорее всего, увидите, что operator+ реализовано с точки зрения operator+=.   -  person François Andrieux    schedule 04.04.2018
comment
На самом деле это не прописано, но все, что вы хотите знать, находится здесь: stackoverflow.com/questions/4421706/   -  person NathanOliver    schedule 04.04.2018
comment
@FrançoisAndrieux Спасибо. Не могли бы вы уточнить ваше последнее заявление?   -  person Mykel    schedule 04.04.2018
comment
Вы увидите, что operator@ реализовано с использованием operator@=, потому что это может быть более эффективным. Часто @= может быть более эффективным, чем обычный @.   -  person Justin    schedule 04.04.2018
comment
@Mykel Обратите внимание, что *this + progA придется создать временный экземпляр myClass, который не должен быть строго необходим для реализации operator+=. Если вы реализуете operator+= напрямую и вместо этого измените operator+, чтобы он ссылался на operator+= (сделайте копию *this и вызовите operator+= для этой копии, которую вы вернете), вы можете получить более эффективную реализацию.   -  person François Andrieux    schedule 04.04.2018
comment
@Justin Спасибо за объяснение. Но если вы реализуете оператор @= перед оператором @, не означает ли это, что вам придется повторно использовать некоторый код для реализации оператора @? идете вразрез с эмпирическим правилом дублирования кода?   -  person Mykel    schedule 04.04.2018
comment
@FrançoisAndrieux Вау. Это блестяще. Спасибо. Новый навык для добавления в мой инструмент. Еще раз спасибо   -  person Mykel    schedule 04.04.2018
comment
Это прекрасно.   -  person Jesper Juhl    schedule 04.04.2018


Ответы (1)


Вы можете сделать это. Однако чаще реализуется operator+ с использованием operator+=, а не наоборот.

myClass & operator += (const myClass & rhs) { ... )

// Return by value.
// const member function.
myClass operator + (const myClass & rhs) const
{
    myClass ret = *this; // Uses copy constructor, not assignment.
    return ret += rhs;
}

Интерфейс

myClass & operator + (const myClass & rhs);

не идиоматичен, так как вы не можете сделать эквивалент

int a = 10 + 20;

С использованием

MyClass a = MyClass(args...) + MyClass(args...);

не будет работать, так как первый объект в RHS является временным объектом.

person R Sahu    schedule 04.04.2018