0 / 0 / 0
Регистрация: 17.02.2023
Сообщений: 13
|
|
1 | |
Оператор = в C++17.02.2023, 17:41. Показов 1234. Ответов 4
Почему везде рекомендуется возвращать ссылку на объект из перегруженного оператора =, а не объект по значению?
Например: класс & operator(const класс&) вместо: класс operator(const класс&) Лишнее копирование? Объясните, я не понимаю
0
|
17.02.2023, 17:41 | |
Ответы с готовыми решениями:
4
Перегрузить для класса Vector оператор умножения и оператор разности Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки Решить задачу используя условный оператор и оператор выбора Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * |
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
|
||||||
17.02.2023, 18:58 | 2 | |||||
Дело не только в лишнем копировании.
Такое поведение нестандартно, и если такое делать, то обязательно нужно это явно описывать. По сути можно возвращать любой тип.
0
|
0 / 0 / 0
Регистрация: 17.02.2023
Сообщений: 13
|
|
17.02.2023, 19:19 [ТС] | 3 |
SmallEvil, так в примере bool возвращается, если на AssignTest заменить(не ссылка) и вернуть из функции *this, то ошибки не будет и все отработает. Все равно не понятно, почему именно по ссылке, а не по значению надо возвращать.
0
|
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
|
||||||
17.02.2023, 19:48 | 4 | |||||
Сообщение было отмечено AlexDev как решение
Решение
Это лишь один пример, таких существует намного больше.
Например после присвоения, вызывается метод этого (ожидается что исходного) же объекта, а на самом деле вызывается от копии объекта и никак не повлияет на исходный. И так далее, то есть полностью меняется поведение объекта с таким вот оператором присваивания. Добавлено через 1 минуту Я специально привел кардинально другой тип, что бы было прям ЯВНО видно изменение в поведении. Добавлено через 8 минут Добавлено через 6 минут Да и зачем возвращать новый объект ? Откуда такая мысль ? Объект с кучей данных, просто так будет копироваться что бы что ? Что бы в большинстве случаев сразу быть уничтоженным ? После a = b; (создается безымянный объект "с") и после завершения выражения сразу удаляется.Зачем ???
Код
Test ~Destroy ~Destroy ~Destroy ~Destroy ~Destroy Еще и опечатался в первом примере (const AssignTest&) !
0
|
0 / 0 / 0
Регистрация: 17.02.2023
Сообщений: 13
|
|
17.02.2023, 19:58 [ТС] | 5 |
SmallEvil, спасибо большое за то, что понятно объяснили, теперь все встало на свои места!
0
|
17.02.2023, 19:58 | |
17.02.2023, 19:58 | |
Помогаю со студенческими работами здесь
5
Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости Копирующий оператор присвоения и оператор + Не работают Как оператор switch превратить в оператор if Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Оператор break как оператор go to next Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |