![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 03.11.2013
Сообщений: 4
|
![]()
Есть класс ThreeD и метод перегрузки ++:
Код:
Почему, тогда, следующее выражение, изменит объект: c = a++ Я понимаю, что это операция инкремента сама по себе и задумана как увеличение числа\поля на 1, но почему так происходит? Ведь в методе перегрузки оператора мы не меняем сам передаваемый объект, а создаем новый, который и возвращаем. Спасибо. Последний раз редактировалось Stilet; 04.11.2013 в 13:52. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]() Код:
1) Создается экземпляр класса ThreeD, ссылка на который хранится в переменной а. Назовем его "Экземпляр 1". 2) Создается переменная с, в которую помещается ссылка на "Экземпляр 1", которая хранится в переменной а (ThreeD c = a) 3) Теперь выполняется оператор "++". Да, только теперь, ибо он записан в постфиксной форме и выполнится уже после присваивания с = а. Этот оператор создаст новый экземпляр класса ThreeD (согласно перегрузке в классе ThreeD) и поместит его в переменную а. Назовем этот экземпляр класса "Экземпляр 2" ИТОГО: Переменная с ссылается на тот самый объект, который был в а изначально ("Экземпляр 1"); Переменная а ссылается на "Экземпляр 2", созданный в перегруженном операторе "++" P.S. Если бы оператор ++ не выполнял бы присваивание переменной своего результата автоматически, то код мог бы выглядеть так: Код:
Благодарить в репутацию. Проклинать — туда же
![]() Последний раз редактировалось Luuzuk; 03.11.2013 в 22:07. |
![]() |
![]() |
![]() |
#3 | |
Регистрация: 03.11.2013
Сообщений: 4
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
Именно так
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
#5 |
Регистрация: 03.11.2013
Сообщений: 4
|
![]()
Спасибо за подробный понятный ответ!
Простите, еще один момент! ![]() Вы говорите, что " ... оператор создаст новый экземпляр класса ThreeD (согласно перегрузке в классе ThreeD) и поместит его в переменную а." А каким образом а начинает ссылаться на rezult? за счет return result ? Немного запутанно. Хочется написать return (a=result)... Растолкуйте, пожалуйста. Спасибо заранее. Последний раз редактировалось Stilet; 04.11.2013 в 13:53. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]()
Ага. Запись "а++" будет обработана как-то так:
1) Будет вызван метод, реализующий оператор "++", в качестве параметра ему будет передана переменная а 2) Результат выполнения этого метода будет записан в переменную "а" результатом выполнения метода в вашем коде является result. Оно и будет записано в переменную "а". Вот такое закулисье в C# )
Благодарить в репутацию. Проклинать — туда же
![]() |
![]() |
![]() |
![]() |
#7 |
Регистрация: 03.11.2013
Сообщений: 4
|
![]()
Да, уж. И это закулисье справедливо только для ++\-- ?. Т.е., например, в методе перегрузке -(унарный) тело метода аналогичное, однако, оно не меняет (не назначает ему другую ссылку, правильней сказать) сам передаваемый ему аргумент:
Код:
|
![]() |
![]() |
![]() |
#8 | |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
![]() Цитата:
Разница в том, что операторы ++ и -- сами по себе должны менять переменную, к которой применены, иначе смысла в них не будет
Благодарить в репутацию. Проклинать — туда же
![]() |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C++ Перегрузка оператора += и >> | Jane-sad | Помощь студентам | 4 | 01.03.2013 15:38 |
Перегрузка оператора [] | dbazulev | Общие вопросы C/C++ | 1 | 02.12.2012 20:19 |
Перегрузка оператора == | Lapo4ka | Общие вопросы C/C++ | 4 | 15.12.2011 01:26 |
перегрузка оператора + | nesss | Помощь студентам | 0 | 01.11.2011 02:23 |
Перегрузка оператора + | Jane-sad | Помощь студентам | 0 | 05.10.2010 13:52 |