Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2013, 21:08   #1
Svorobey
 
Регистрация: 03.11.2013
Сообщений: 4
Вопрос Перегрузка оператора ++

Есть класс ThreeD и метод перегрузки ++:

Код:
public static ThreeD operator ++(ThreeD op)
    {
        ThreeD result = new ThreeD();
 
        result.x = op.x + 1;
        result.y = op.y + 1;
        result.z = op.z + 1;
 
        return result;
    }
Т.е. исходя из кода, видно, что передаваемый аргумент op не должен изменяться, вместо этого возвращается некий, вновь созданный объект result, куда уже и помещается значение op, увеличенное на 1.
Почему, тогда, следующее выражение, изменит объект:

c = a++

Я понимаю, что это операция инкремента сама по себе и задумана как увеличение числа\поля на 1, но почему так происходит? Ведь в методе перегрузки оператора мы не меняем сам передаваемый объект, а создаем новый, который и возвращаем.

Спасибо.

Последний раз редактировалось Stilet; 04.11.2013 в 13:52.
Svorobey вне форума Ответить с цитированием
Старый 03.11.2013, 22:02   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
ThreeD a = new ThreeD();
ThreeD c = a++;
Этот код исполняется примерно так:

1) Создается экземпляр класса ThreeD, ссылка на который хранится в переменной а. Назовем его "Экземпляр 1".
2) Создается переменная с, в которую помещается ссылка на "Экземпляр 1", которая хранится в переменной а (ThreeD c = a)
3) Теперь выполняется оператор "++". Да, только теперь, ибо он записан в постфиксной форме и выполнится уже после присваивания с = а. Этот оператор создаст новый экземпляр класса ThreeD (согласно перегрузке в классе ThreeD) и поместит его в переменную а. Назовем этот экземпляр класса "Экземпляр 2"

ИТОГО:
Переменная с ссылается на тот самый объект, который был в а изначально ("Экземпляр 1");
Переменная а ссылается на "Экземпляр 2", созданный в перегруженном операторе "++"


P.S. Если бы оператор ++ не выполнял бы присваивание переменной своего результата автоматически, то код мог бы выглядеть так:

Код:
ThreeD a = new ThreeD();
ThreeD c = a;
a = a++; // Если бы "++" был просто методом, то пришлось бы писать так, чтобы добиться того же самого результата, что и выше
P.P.S. Пруф: http://msdn.microsoft.com/ru-ru/library/ms173145.aspx, самый первый пример
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 03.11.2013 в 22:07.
Luuzuk вне форума Ответить с цитированием
Старый 03.11.2013, 22:41   #3
Svorobey
 
Регистрация: 03.11.2013
Сообщений: 4
Счастье

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
...Этот оператор создаст новый экземпляр класса ThreeD (согласно перегрузке в классе ThreeD)
который в примере именуется result ?
Цитата:
Сообщение от Luuzuk Посмотреть сообщение
ИТОГО:
Переменная с ссылается на тот самый объект, который был в а изначально ("Экземпляр 1");
Переменная а ссылается на "Экземпляр 2", созданный в перегруженном операторе "++"
т.е. в нашем случае a++ = a = result; ??
Svorobey вне форума Ответить с цитированием
Старый 03.11.2013, 23:27   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Именно так
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 03.11.2013, 23:34   #5
Svorobey
 
Регистрация: 03.11.2013
Сообщений: 4
По умолчанию

Спасибо за подробный понятный ответ!

Простите, еще один момент!
Вы говорите, что " ... оператор создаст новый экземпляр класса ThreeD (согласно перегрузке в классе ThreeD) и поместит его в переменную а."
А каким образом а начинает ссылаться на rezult? за счет return result ? Немного запутанно. Хочется написать return (a=result)... Растолкуйте, пожалуйста. Спасибо заранее.

Последний раз редактировалось Stilet; 04.11.2013 в 13:53.
Svorobey вне форума Ответить с цитированием
Старый 04.11.2013, 12:42   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Ага. Запись "а++" будет обработана как-то так:
1) Будет вызван метод, реализующий оператор "++", в качестве параметра ему будет передана переменная а
2) Результат выполнения этого метода будет записан в переменную "а"

результатом выполнения метода в вашем коде является result. Оно и будет записано в переменную "а". Вот такое закулисье в C# )
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.11.2013, 13:00   #7
Svorobey
 
Регистрация: 03.11.2013
Сообщений: 4
По умолчанию

Да, уж. И это закулисье справедливо только для ++\-- ?. Т.е., например, в методе перегрузке -(унарный) тело метода аналогичное, однако, оно не меняет (не назначает ему другую ссылку, правильней сказать) сам передаваемый ему аргумент:
Код:
public static ThreeD operator -(ThreeD op)
    {
        ThreeD result = new ThreeD();

        result.x = -op.x;
        result.y = -op.y;
        result.z = -op.z;

        return result;
    }
И, получается, что в операции. c=-a. с станет , а а останется собой.
Svorobey вне форума Ответить с цитированием
Старый 04.11.2013, 13:07   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
И, получается, что в операции. c=-a. с станет -а, а а останется собой.
c станет равным result, а а останется прежним.
Разница в том, что операторы ++ и -- сами по себе должны менять переменную, к которой применены, иначе смысла в них не будет
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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