Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Всем привет! У меня есть класс Example с перегруженным оператором присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. В данной реализации Код: plaintext 1. возвращается ссылка на объект, но я могу без проблем вернуть и сам объект Код: plaintext 1. У меня соответственно вопрос какая разница возвращать объект по значению или по ссылке? И как правильно? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 23:24 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
авторУ меня есть класс Example с перегруженным оператором сложения: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 23:25 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_GУ меня соответственно вопрос какая разница возвращать объект по значению или по ссылке? И как правильно? Ссылку - неправильно, т.к. при выходе из оператора объект, на которрый она ссылается будет уничтожен, и она станет невалидной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 23:35 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_GУ меня соответственно вопрос какая разница возвращать объект по значению или по ссылке? И как правильно? Ссылку - неправильно, т.к. при выходе из оператора объект, на которрый она ссылается будет уничтожен, и она станет невалидной. Спасибо за комментарий! Не очень понятно, что значит "при выходе из оператора". При выходе из функции "operator+"? А если тогда рассматривать кейс без нового объекта: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2013, 23:44 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Нет, возвращать надо именно новый объект, иначе вы производите операцию =+, а не +. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 00:23 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_G, Нет, возвращать надо именно новый объект, иначе вы производите операцию =+, а не +. Еще больше запутался. Давайте тогда по порядку. Можете, подробно обяснить, что Вы имели ввиду здесь? Ссылку - неправильно, т.к. при выходе из оператора объект, на которрый она ссылается будет уничтожен, и она станет невалидной. Ведь такой код нормально работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. То есть ссылка нормально передалась, я так понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 01:35 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Повезло просто, что участок памяти в котором был объект еще не занят другим объектом. Вы верите, что вам и дальше будет везти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 02:01 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
У меня есть класс Example с перегруженным оператором присваивания: Тут нет перегруженного = Код: plaintext 1. возвращается ссылка на объект, но я могу без проблем вернуть и сам объект Код: plaintext 1. Тут ты ОБЯЗАН вернуть объект по значению. По ссылке возвращать нельзя, ей просто не на что ссылаться. Также этот оператор должен быть const. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 09:46 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_GAnatoly MoskovskyMaximuS_G, Нет, возвращать надо именно новый объект, иначе вы производите операцию =+, а не +. Еще больше запутался. Давайте тогда по порядку. Можете, подробно обяснить, что Вы имели ввиду здесь? Напиши себе подробно что должен делать твой оператор, какие действия, про шагам, на русском языке, и ты всё сам поймеш. Если нет, сделай то же самое для operator += и сравни описания. Если опять нет - шли оба описания сюда. MaximuS_GСсылку - неправильно, т.к. при выходе из оператора объект, на которрый она ссылается будет уничтожен, и она станут невалидной. Ведь такой код нормально работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. То есть ссылка нормально передалась, я так понимаю. Ты понимаеш неправильно. Код НЕ работает, что он работает, тебе просто кажется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 09:53 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MasterZivУ меня есть класс Example с перегруженным оператором присваивания: Тут нет перегруженного = Код: plaintext 1. возвращается ссылка на объект, но я могу без проблем вернуть и сам объект Код: plaintext 1. Тут ты ОБЯЗАН вернуть объект по значению. По ссылке возвращать нельзя, ей просто не на что ссылаться. Также этот оператор должен быть const. Спасибо за комментарий! авторТакже этот оператор должен быть const. Так? авторExample& operator+(const Example &from) const ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:47 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_G, Повезло просто, что участок памяти в котором был объект еще не занят другим объектом. Вы верите, что вам и дальше будет везти? Я понял, спс) Попробовал все таки получить кривой результат, для этого объявил obj как ссылку, что бы объект не копировался, а просто по ссылке ссылался. Создал еще пару объектов после этого. Но память, на которую ссылка указывает, все равно не зачистилась. Код: plaintext 1. 2. 3. 4. 5. Есть верный способ, что бы память там затереть, и что бы тогда cout<<obj.eField1 вывел мусор? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2013, 23:51 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_G, Нет, возвращать надо именно новый объект, иначе вы производите операцию =+, а не +. Ага, после раздумий кажется понял :). Вы имеете ввиду, что операция =+ производится здесь авторobj = obj1+obj2 ; То есть как будто просто в коде написать вот так: Код: plaintext 1. 2. 3. ? Я попробовал перегрузить операцию "=+" - копмилятор говорит, что ошибка. авторExample operator=+(const Example &from) const Этот оператор перегрузить нельзя? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:27 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_GЕсть верный способ, что бы память там затереть, и что бы тогда cout<<obj.eField1 вывел мусор? Самое простое - в деструкторе Example обнулять поле eField1. И тогда ваш оператор всегда будет давать 0 в качестве результата. На самом деле в деструкторах реальных объектов может происходить многое, после чего останками объекта ни в коем случае нельзя пользоваться. Так что до затирания памяти другими объектами не обязательно дойдет :) Но и затирание тоже можно продемонстрировать. Например водном выражении вычислите сумму 3-х слагаемых, а не 2-х. Код: plaintext 1. Тогда в момент вызова второго сложения, результат первого может быть затерт. Для гарантированного затирания надо перед вычислением суммы сначала в поле присвоить 0. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:29 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_GAnatoly MoskovskyMaximuS_G, Нет, возвращать надо именно новый объект, иначе вы производите операцию =+, а не +. Ага, после раздумий кажется понял :). Вы имеете ввиду, что операция =+ производится здесь авторobj = obj1+obj2 ; То есть как будто просто в коде написать вот так: Код: plaintext 1. 2. 3. ? Я не понял что вы имеете в виду, но одно точно - вы все еще неверно понимаете как надо реализовывать операторы + и =+, и что они делают. Я попробовал перегрузить операцию "=+" - копмилятор говорит, что ошибка. авторExample operator=+(const Example &from) const Этот оператор перегрузить нельзя? Можно, но вот тут как раз надо убрать const и добавить ссылку в результат, т.к. =+ должен модифицировать объект и его же вернуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:34 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Я что-то пропустил и в C/C++ появились "альтернативные" операторы с присваиванием? А чем тогда "=+" отличается от "+="? Сначала присваивает, а потом складывает? А зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:41 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЯ что-то пропустил и в C/C++ появились "альтернативные" операторы с присваиванием? А чем тогда "=+" отличается от "+="? Сначала присваивает, а потом складывает? А зачем? Это была опечатка :) Правильный оператор +=. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:49 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_GЯ попробовал перегрузить операцию "=+" - копмилятор говорит, что ошибка. авторExample operator=+(const Example &from) const Этот оператор перегрузить нельзя?такого оператора не существует, зато есть оператор +=, о котором и говорит Anatoly Moskovsky. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 00:51 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Так? авторExample& operator+(const Example &from) const [/quot] Нет. Example operator+(const Example &from) const; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 02:13 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Есть верный способ, что бы память там затереть, и что бы тогда cout<<obj.eField1 вывел мусор? Заранее спасибо![/quot] Да, собери приложение в релизной сборке с оптимизацией... Правда, чётких гарантий нет всё равно и не может быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 02:16 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_G Код: plaintext 1. 2. 3. 4. 5. Есть верный способ, что бы память там затереть, и что бы тогда cout<<obj.eField1 вывел мусор? Заранее спасибо! Во, придумал, попробуй создать несколько автоматических объектов или переменных после вызова operator+ и получения его результата, а потом попробуй прочитать результат. Что должно произойти -- переменные должны перетереть память, ранее занимаемую этм объектом, и ты должен увидеть вместо результата какой-то мусор. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 02:31 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_G Я попробовал перегрузить операцию "=+" - копмилятор говорит, что ошибка. авторExample operator=+(const Example &from) const Этот оператор перегрузить нельзя? Потому что операция нифига не "=+", а "+=". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 02:33 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Если код из поста 1 скормить студии 2010, то получаем warning C4172, вот справка о нем: MSDNCompiler Warning (level 1) C4172 Visual Studio 2010 returning address of local variable or temporary A function returns the address of a local variable or temporary object. Local variables and temporary objects are destroyed when a function returns , so the address returned is not valid. Redesign the function so that it does not return the address of a local object. The following sample generates C4172: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Локальные и временные объекты разрушаются после выхода из функции, но до присваивания возвращаемого значения чему-то другому. В простых случаях ничто не затирает память, занятую временными и локальными объектами. Чтобы присваивание не сработало, нужно, чтобы эта память использовалась чем-то еще. Это может быть не только деструктор возвращаемого по ссылке объекта, но и оператор, выполняющий присваивание временного объекта, если перед собственно присваиванием он использует память этого временного объекта, например, под свои локальные объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 11:06 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
Всем спасибо большое за ответы! Anatoly MoskovskyЭто была опечатка :) Правильный оператор +=. Да, действительно такой оператор получается переопределить. А странно тогда, почему в main() прокатывают оба оператора: Код: plaintext 1. 2. 3. 4. Компилятор сам заменяет неправильный оператор на правильный? Anatoly MoskovskyЯ не понял что вы имеете в виду, но одно точно - вы все еще неверно понимаете как надо реализовывать операторы + и =+, и что они делают. Как я понимаю :). У оператора "+" два операнда. Но можно и один сделать. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Или для изменения объекта без последующего присваивания лучше переопределять операцию "++", а оператор "+" использовать для двух операндов (и последующего присвоения результата операции)? И у меня тогда остается такой вопрос, нужно ли возвращать ссылку на себя, если изменяется объект, но измененный объект ничему не присваивается? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 13:34 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
teo609 , не очень понятно, что здесь происходит. Сможете прояснить немного? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 14:32 |
|
||
|
переопределенный оператор - возвращение типа по ссылке и по значению
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА странно тогда, почему в main() прокатывают оба оператора: Код: plaintext 1. 2. 3. Потому, что синтаксис надо учить. Во второй строке переменной t, имевшей значение 3, переприсваивается значение 2. С явным указанием необязательного знака плюс. В третьей строке выполняется оператор с присваиванием и в результате получается 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 18:42 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38108685&tid=2020432]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 560ms |

| 0 / 0 |
