2015-03-07 2 views
0

если у меня есть перегрузка оператора в моем классе, также неявно создана версия назначения оператора?Операторы неявного присваивания [C++]

class square{ 
    square operator+(const square& B); 
    void operator=(const square& B); 
}; 

Как и в, можно затем вызвать

square A, B; 
A += B; 

с компилятор неявно решив назвать 'оператор +', то 'оператор ='?

+0

Перегрузка оператора - один из лучших способов сделать код нечитаемым. Согласно [Руководству по стилю Google C++] (http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Operator_Overloading): «В общем, не перегружайте операторов. Вы можете определить обычные функции, такие как Equals () если они вам нужны. – msw

+1

Это гораздо приятнее, хотя при создании классов, которые должны использоваться для представления чисел, чтобы читать код в знакомом формате, это вопрос; A = A.add (B) .div (C).mul (D) vs A = (A + B)/C * D – user4578093

ответ

4

Нет, операторы не определены неявно. Однако boost/operators.hpp определяет полезные вспомогательные шаблоны, чтобы избежать кода котельной. Пример из их документации:

Если, например, вы объявляете класс как это:

class MyInt 
    : boost::operators<MyInt> { 
    bool operator<(const MyInt& x) const; 
    bool operator==(const MyInt& x) const; 
    MyInt& operator+=(const MyInt& x); 
    MyInt& operator-=(const MyInt& x); 
    MyInt& operator*=(const MyInt& x); 
    MyInt& operator/=(const MyInt& x); 
    MyInt& operator%=(const MyInt& x); 
    MyInt& operator|=(const MyInt& x); 
    MyInt& operator&=(const MyInt& x); 
    MyInt& operator^=(const MyInt& x); 
    MyInt& operator++(); 
    MyInt& operator--(); }; 

то operators<> шаблон добавляет более десятка дополнительных операторов, таких как operator>, <=, >=, и (двоичный код) +. Формы шаблонов с двумя аргументами также предоставляются в , что позволяет взаимодействовать с другими типами.

Кроме того, существует также поддержка неявного «выведения» только определенного набора операторов с использованием arithmetic operator templates.

5

Нет, += должно быть определено явно.


В качестве примечания, operator+should usually create a new object:

square operator+(const square& B); 

И operator=should return a reference to *this:

square& operator=(const square& B); 

Также стоит отметить, что operator+ обычно реализуется в терминах operator+=, т.е. operator+ называет operator+= на новой копии.

+0

, как и во всех моих примерах, но я оставляю operator = void обычно, так как я никогда не использовал множественное присвоение – user4578093

+0

также, что refrence не предполагалось быть там – user4578093

+1

Даже если вы еще не использовали его * до сих пор *, это не повредит его там. Компилятор будет оптимизировать его там, где вы его не используете. – emlai

3

No operator+= является его собственным оператором и должен быть определен явно.

Обратите внимание, что operator+ должен возвращать новый объект, а не ссылку на исходный объект. Исходный объект следует оставить без изменений.

operator+= должен вернуть исходный объект с добавленной стоимостью. operator+= часто предпочтительнее, так как он исключает временный объект.

+0

ссылка на оператора + была непреднамеренной – user4578093

Смежные вопросы