2012-01-13 3 views
2

Вот мой код:Почему мне не нужно перегружать оператор присваивания в C++?

class Example { 
...declarations/definitions... 
}; 

Example operator + (Example e) 
{ 
Example temp; 
...do addition... 
return temp; 
} 

//main 
void main() 
{ 
Example a(1,2); 
Example b(3,4); 
Example c; 
c = a+b; 
} 

Теперь то, что меня смущает, что я должен перегружать оператор + для того, чтобы работать с векторами, но как о равном «=» знак ?? Я назначаю один вектор другому, не должен ли я перегружать его тоже? Или он уже предоставлен нам? Спасибо.

+2

Это определение выглядит как унарный оператор '+', а не дополнение. – Pubby

+0

@ Азза, близко, но не совсем. Он назначает каждого из членов, но не побитовое. Также компилятор создает конструкторы по умолчанию, деструкторы, перемещает конструкторы и автоматически переносит операторы присваивания. –

ответ

4

Язык обеспечивает по умолчанию operator= для вас автоматически, если ваш класс по умолчанию назначаемые (например, если он имеет какие-либо опорные элементы не будут назначаться без особого труда вами). Все, что он делает, - это назначение базы и каждого члена отдельно.

3

От wikipedia page:

Версия по умолчанию [от оператора присваивания] выполняет почленно копию, где каждый член копируется своим собственным оператором присваивания копии (который также может быть программистом объявлена ​​или от компилятора генерируется).

+0

Английский? Я знаю, что вы говорите, но другие могут этого не сделать. – ThatOtherPerson

+2

Э? Что с этим не так? –

+0

@ThatOtherPerson, это английский, если я когда-либо видел. –

0

A std::vector? Если да, то std::vector реализует оператор присваивания по умолчанию. Из страницы руководства:

«Назначает копию вектора х в качестве нового контента для векторного объекта

Элементы, содержащиеся в векторном объекте до вызова отбрасываются, и заменены копиями тех, в вектора х. , если таковые имеются.

После вызова этой функции-члена как векторный объект, так и вектор x будут иметь одинаковый размер и сравнивать друг с другом ».

Редактировать-на днях я отправлю ответ первым!

1

Оператор присваивания задается по умолчанию вместе с конструктором копирования и конструктором по умолчанию. Он присваивает значение каждого элемента данных соответствующему элементу данных в другом объекте (т. Е. Мелкой копии).

2

Если вы не объявляете оператор присваивания копий в своем классе, то он неявно объявлен для вас (и неявно определен, если вы когда-либо его используете).

Неявный оператор назначит каждому члену вашего объекта, если это возможно; в противном случае (если какой-либо элемент является ссылкой или const или имеет частный или удаленный оператор присваивания копии), вы получите ошибку компиляции.

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

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