#c #operator-overloading #assignment-operator
#c #оператор-перегрузка #оператор присваивания
Вопрос:
представьте, что у меня есть такой класс:
public:
A(const int a);
Aamp; operator = (const Aamp;);
};
Почему возвращаемый тип оператора «=» должен быть «A amp;», а не просто «A»?
Комментарии:
1. что бы это вернуло
A
? Обратите внимание, что это не может быть obejct, которому вы только что присвоили, это может быть его копия, но для чего это было бы хорошо?2. Это не обязательно . Вы могли бы это сделать
void
.
Ответ №1:
Возвращаемый тип не обязательно должен быть Aamp;
; стандарт говорит только:
Объявленный пользователем оператор присваивания копии
X::operator=
представляет собой нестатическую не шаблонную функцию-член классаX
с ровно одним параметром типаX
,Xamp;
,const Xamp;
,volatile Xamp;
, илиconst volatile Xamp;
.
Мы делаем это по соглашению.
Часто цитируемый аргумент заключается в том, что затем вы можете «связать» присваивания ( a = b = c
) , хотя, честно говоря, это не совсем обычный шаблон. Я считаю, что это в какой-то степени культовое программирование, но это никому не вредит, и приятно иметь согласованность.
Недостатком является то, что большинство людей даже не используют такой возвращаемый тип, и иногда фактическая причина этого может быть потеряна (согласно this question !).
Мы не возвращаем an A
, потому что возврат по значению (т. Е. Возврат _copy ) обрабатываемого объекта) вместо этого был бы еще менее полезным и запутал бы цель оператора присваивания, которая заключается не в создании нового A
.
Ответ №2:
Все они строятся без ошибок:
Aamp; operator = (const Aamp;);
Aamp; operator = (Aamp;);
Aamp; operator = (const Aamp;);
Aamp; operator = (A);
A operator = (const Aamp;);
const Aamp; operator = (const Aamp;);
void operator = (const Aamp;);
оператор присваивания копирования — это функция, подобная любым другим функциям. Вы даже можете вызвать его явно при вызове любой другой функции:
A test;
A testToBeCopied;
test.operator=(testToBeCopied);
Вы можете ожидать const или нет или вызывать функцию copy assignment operator с const или без const, как и любая другая функция. Вам не нужно ожидать const или ref . Вы даже можете вернуть void . С другой стороны, для вызова функции с передачей по ссылке или передачей по значению ожидать const или not в подписи зависит от ваших потребностей. Цепочка методов является примером необходимости возврата ссылки. Вы можете передать ref из-за эффективности и потому, что вам не нужен другой новый созданный объект.