Возвращаемый тип оператора присваивания в C

#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 из-за эффективности и потому, что вам не нужен другой новый созданный объект.