![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
1. Ссылка и указатель на функцию значат, что функция создала переменную с результатом и на эту переменную возвратила адрес. Но локальные переменные после завершения работы функции удаляются. Или ссылки и указатели дают, если возвращающее значение создается в куче? 2. Не понятны выделенные строки - копировать не стал, чтобы пост не увеличивать. |
||||
|
|||||
xvr |
|
||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Если в целом, то такое действо:
|
||||||||||||||||
|
|||||||||||||||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Получается, даже стековый объект не уничтожается и поэтому на него можно возвращать ссылки и указатели?
С переводом туго, пытаюсь въехать, как понял. ref - ссылка на результат функции и она объявлена константой, т.е. менять ее значение нельзя. Это как-то связано с тем, что значение на самом деле находится в функции? Например, компилятор запрещает писать в такие участки памяти? Это сообщение отредактировал(а) Gunslinger - 17.12.2009, 10:09 |
||||
|
|||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Нет. Это случай, когда возвращается САМ объект (by value), а не ссылка или указатель на него. В таком случае происходит копирование возвращаемого объекта из стека вызванной функции в стек вызывающей (при выполнении оператора return в вызванной функции)
![]() Основной цимус тут в том, что такая конструкция позволяет избежать копирования объекта (за счет усложнения компилятора ![]() |
||||||||
|
|||||||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
и У меня не вяжется. Сейчас моя логика такая: 1. Автоматические переменные после выхода из блока уничтожаются 2. Ссылка - всего лишь псевдоним и вместо нее компилятор подставляет автоматическую переменную из блока функции 3. Указатель - адрес. Адресуется опять же на переменную в функции. Отсюда выводы такие: 1. Возврат по значению: либо объект, либо выражение (temporary T3 из примера стандарта) копируется в переменную во внешней программе, которой присвоен 2. Возврат по ссылке\указателю: работа с переменной\temporary T3 функции Это сообщение отредактировал(а) Gunslinger - 17.12.2009, 19:29 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это так, но совершенно непонятно, какое это имеет отношение к рассматриваемому примеру - там нет возврата ПО ССЫЛКЕ или УКАЗАТЕЛЯ.
|
||||
|
|||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Весь компилятор 'чисто логическая штука' Процессор ничего не знает о том, что такое 'объект', 'класс', 'exception' и т.д.
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Имхо, В cpp (как в любом ЯВУ) практически все конструкции надо понимать как "логическую штуку", за исключением когда специально расматривается конструкция в условиях реализации конкретного компилятора. увы не всего лишь. Это утверждение справедливо лишь ссылки на полноценный объект. Есть еще правило, приведенное цитатой xvr и на которое Вы не обратили должного внимания :
![]() Добавлено через 1 минуту и 56 секунд ![]() 32 ?! ![]() Это сообщение отредактировал(а) mes - 18.12.2009, 10:26 |
|||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Там по временные переменные, ссылки и время жизни - а все вместе скомпоновать в осмысленное предложение я не смог. Вот и не понял смысл 3й альтернативы. Это сообщение отредактировал(а) Gunslinger - 18.12.2009, 13:15 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
В общем там говорится , что если временный объект "пристыковать" к ссылке, то он сохраняется (удлиняет жизнь) на все время жизни ссылки. ![]() Это сообщение отредактировал(а) mes - 18.12.2009, 13:28 |
|||
|
||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Спасибо, но чем тогда эта инфа из стандарта отличается от тоо, что я писал выше:
Судя по ответу xvr, мой ответ не подходил для данного случая. Мне интересно, как правильно - чтобы знать нюансы работы с получаемыми подобным образом (*, &) результатами. Это сообщение отредактировал(а) Gunslinger - 18.12.2009, 14:13 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
А когда уничтожаются временные объекты ? который имеет некоторые (неочевидные) особенности/правила связанные с его использованием блок функции и функциональный блок - несколько разные понятия Нет. У адреса можно разве взять его адрес ? да ?! Сомневаюсь что из приведенного можно сделать правильные выводы, хотя если честно я абсолютно не понял, что в них пытались выразить и как это связано с обсуждаемым вопросом. оба Ваших вывода ![]() Ну это я могу объяснить.. Потому что вместо того чтоб принять абстракции и разбирать их, Вы пытаетесь найти во что превращаются абстрактные инструменты в конечном исполнении, упустив при этом большую часть работы. То есть вместо разбора того, как рисовать худ. инструментами, и какими особенностями обладает каждая из них, например чем кисточка отличается от каранда и от губки, Вы приводите все к одному выводу, они оставляют след краской. Может для ксерокопии картины и достаточно изучить каким цветом выражен каждый пиксель, но для художества, надо понимать, как можно получить нужный эффект, не заботясь о каждом пикселе. Это сообщение отредактировал(а) mes - 18.12.2009, 16:03 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |