|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
03.11.2013, 21:08 | #1 |
Регистрация: 03.11.2013
Сообщений: 4
|
Перегрузка оператора ++
Есть класс ThreeD и метод перегрузки ++:
Код:
Почему, тогда, следующее выражение, изменит объект: c = a++ Я понимаю, что это операция инкремента сама по себе и задумана как увеличение числа\поля на 1, но почему так происходит? Ведь в методе перегрузки оператора мы не меняем сам передаваемый объект, а создаем новый, который и возвращаем. Спасибо. Последний раз редактировалось Stilet; 04.11.2013 в 13:52. |
03.11.2013, 22:02 | #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. |
03.11.2013, 22:41 | #3 | |
Регистрация: 03.11.2013
Сообщений: 4
|
Цитата:
|
|
03.11.2013, 23:27 | #4 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
Именно так
Благодарить в репутацию. Проклинать — туда же
|
03.11.2013, 23:34 | #5 |
Регистрация: 03.11.2013
Сообщений: 4
|
Спасибо за подробный понятный ответ!
Простите, еще один момент! Вы говорите, что " ... оператор создаст новый экземпляр класса ThreeD (согласно перегрузке в классе ThreeD) и поместит его в переменную а." А каким образом а начинает ссылаться на rezult? за счет return result ? Немного запутанно. Хочется написать return (a=result)... Растолкуйте, пожалуйста. Спасибо заранее. Последний раз редактировалось Stilet; 04.11.2013 в 13:53. |
04.11.2013, 12:42 | #6 |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
Ага. Запись "а++" будет обработана как-то так:
1) Будет вызван метод, реализующий оператор "++", в качестве параметра ему будет передана переменная а 2) Результат выполнения этого метода будет записан в переменную "а" результатом выполнения метода в вашем коде является result. Оно и будет записано в переменную "а". Вот такое закулисье в C# )
Благодарить в репутацию. Проклинать — туда же
|
04.11.2013, 13:00 | #7 |
Регистрация: 03.11.2013
Сообщений: 4
|
Да, уж. И это закулисье справедливо только для ++\-- ?. Т.е., например, в методе перегрузке -(унарный) тело метода аналогичное, однако, оно не меняет (не назначает ему другую ссылку, правильней сказать) сам передаваемый ему аргумент:
Код:
|
04.11.2013, 13:07 | #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 |