Почему перегруженный оператор = мандатом, чтобы быть функцией членом ($ 13.5.3), но не является оператором присваивания соединения, например, оператор + = (13,5,2)? Я что-то забыл?Оператор перегрузки
ответ
Срезы вы ссылаетесь должны это сказать о скрытии реализации базового класса operator=
Поскольку оператор копирующего присваивания
operator=
неявно объявляется для класса, если не заявлено пользователем (12.8),
Это также может быть ответом на ваш вопрос, поскольку компилятор должен знать, должен ли он генерировать operator=
, он должен знать, был ли такой оператор определен, если он может быть определен вне класса, компилятор не мог знать, если было определено в другой единицы перевода.
например.
//a.h
class A { }; // compiler thinks A::operator= should be implicitly defined
//b.h
#include "a.h"
A& operator=(A& This, const A& other) { /*...*/ } // Oops it's explicitly defined
Составные операторы, с другой стороны, не неявно определяется, следовательно, нет никаких причин, чтобы заставить их быть объявлены как функции-члены.
Назначение копирования operator=
, как член, всегда предоставляется компилятором, если пользователь не определяет его. Я считаю, что только для простоты и избежания неожиданных двусмысленностей требовалось, чтобы operator=
не может быть определена как свободная функция.
операторы преобразования заботиться о том случае, когда вы хотите назначить от определяемого пользователем типа для встроенного типа.
Итак, теперь я задаю вопрос, почему некоторые операторы должны быть перегружены как члены, например. оператор [], оператор(), а другие нет? – Chubsdad
@ Chubdad, нет, это не ваш вопрос, это другой вопрос, не стесняйтесь отвечать на него, но Чарльз (и другие) ответил на этот вопрос. – Motti
@Motti: Не уверен, что это происходит с вами или нет, но это происходит со мной, по крайней мере. При обсуждении и совместном использовании появляется гораздо больше ясности о том, что нужно – Chubsdad
Наряду с дефолтом и конструкторов копирования, оператор = также обрабатывается специально в C++. Это означает, что даже если вы не объявите его, компилятор предоставит вам реализацию по умолчанию. Но реализация по умолчанию - это не всегда поведение, соответствующее потребностям вашего класса, поэтому вы должны явно заявить их (или скрыть их, назначив конфиденциальную видимость).
И почему конструктор по умолчанию, конструктор копирования и оператор присваивания такого особенного? Потому что они участвуют в стандартной инициализации переменных и передаче параметров: когда вы передаете параметр, заданный в классе, по функции по значению (не по ссылке или указателю), эти операции вызывают для копирования содержимого в стек.
Как заявил Чарльз, присвоение копии operator=
всегда предоставляется компилятором, если пользователь не определяет один. Этот предоставленный компилятором элемент-член всегда будет иметь приоритет над функцией, отличной от члена, поэтому даже если вы можете определить ее как функцию, не являющуюся членом, она не будет вызываться.
- 1. Оператор перегрузки +
- 2. оператор перегрузки! =
- 3. оператор перегрузки
- 4. Оператор перегрузки%
- 5. Оператор перегрузки =
- 6. Перегрузки оператор ++
- 7. Перегрузки оператор +
- 8. Перегрузки ++ оператор
- 9. Оператор перегрузки []
- 10. Оператор перегрузки =
- 11. + = оператор перегрузки
- 12. Оператор перегрузки
- 13. Перегрузки "+" - оператор
- 14. Перегрузки оператор =
- 15. Оператор перегрузки []
- 16. оператор перегрузки [оператор А() Const]
- 17. оператор-оператор перегрузки базового класса
- 18. Оператор перегрузки "оператор T *()" производит оператор сравнения?
- 19. Оператор перегрузки C++ [] []
- 20. Перегрузки оператор ->
- 21. оператор перегрузки <<
- 22. Оператор перегрузки полиномиального деления
- 23. оператор перегрузки в C++
- 24. Перегрузки меньше, чем оператор
- 25. Понимание C++ оператор перегрузки
- 26. C# оператор требует перегрузки
- 27. C++ - перегрузки оператор []
- 28. Оператор перегрузки для набора
- 29. Оператор перегрузки для байта []
- 30. Оператор перегрузки = ошибка
Возможный дубликат [Почему функция friend не может использоваться для перегрузки оператора присваивания?] (Http://stackoverflow.com/questions/3933637/why-friend-function-cant-be-used-for-overloading- назначение-оператор) –