![]() |
|
Модераторы: bsa |
![]()
|
|
| Artem7 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 18.10.2012 Репутация: нет Всего: нет |
Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу. Опять же вопрос по примеру из книги Шилдта С++ Базовый курс. Пример: Перегружаем операторы присваивания:
Развернутый вопрос: Что я знаю об операторе присваивания: Оператор присваивания должен модифицировать один из своих аргументов. Так как у нас ф-ия operator=() вызывается объектом левостоящим от оператора "=", значит он и должен модифицироваться в результате операции. То есть у нас левостоящий объект вызывает функцию , и передается ей неявно через указатель this. Здесь его нет ( в книге Шилдт тоже не использовал практически его в примерах), но как я понимаю запись:
эквивалентна записи:
Таким образом, по первому случаю (1.Присваиваем один объект типа str_type другому) у меня вопросов нет, здесь член str.string копируется в вызвавший функцию левый параметр с помощью указателя this. До этого так и переружали во всех примерах оператор "=". Но вот во 2-ом варианте перегрузки оператора "=" (2.Присваиваем строку с завершающим нулем объекту типа str_type) все не очень понятно)). Получается, что здесь мы создаем временный объект , который и возвращаем. Получается , что в итоге этот (2 вариант перегрузки) не будет модифицировать левостоящий параметр (в чем собственно суть присваивания), а просто мы получим результат операции:
(Результат аналогичный например операции сложения а+б=с) Внимание уточненные вопросы :: 1) Зачем мы создаем (в случае 2-ого варианта перегрузки оператора "=" ) временный объект temp; 2)Действительно ли этот 2-ой вариант перегрузки оператора "=" не будет модифицировать значение левостоящего параметра; 3)Почему 2-ой вариант перегрузки оператора "=" нельзя было сделать по аналогии с 1-ым вариантом перегрузки оператора "="; Заранее огромное спасибо за ответы!!!!!! |
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Честно говоря, пример несколько некорректен. Так как в первом случае тоже неявно создается временный объект перед вызовом оператора присваивания. Правильно делать только один оператор присваивания - объекта того же типа, что и присваивающий. А присваивание остальных реализовать через соответствующие конструкторы. Хотя, из правила могут быть исключения, например, в тех случаях когда операция собственно присваивания довольно затратная по ресурсам (например, копирования строки, как в твоем случае). Короче, код должен выглядеть примерно так:
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Это кто Шилдт такую шнягу предлагает? Лучше бы он длину строки проверил, а не морочил новичкам голову с временными объектами... (впрочем вероятно это не Шилдт, а собсвенная версия ТС.) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |