184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
|
|
1 | |
Касательно указателей и ссылок.30.01.2012, 12:12. Показов 1437. Ответов 16
Метки нет (Все метки)
Цитирую фразу из популярной ныне книги Айвора Хортона.
"Никогда не возвращайте из функции ссылку на локальную переменную" Так вот. Не понятно почему так категорично все. По моему даже оч. удобно создать лок. переменную, присвоить ей ссылку на объект. поработать с ним. переменную удалить. Я вот подобным образом свою программу делаю. Озадачила меня эта вот фраза. Прошу помощи в разъяснении данного вопроса.
0
|
30.01.2012, 12:12 | |
Ответы с готовыми решениями:
16
Касательно указателей и функций Сравнение указателей и ссылок. Использование ссылок и указателей Ступор в возврате указателей и ссылок |
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
30.01.2012, 12:13 | 2 |
Ну все путем практики осваивается
Локальный объект - он на то и локальный - что бы потом и "самоликвидироваться" после выхода за область действия. А вы, понимаете, того, использовать его намереваетес. Если прям надо, просто верните обеъкт, не указатель\ссылку.
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|||||||||||
30.01.2012, 12:42 | 4 | ||||||||||
Вот так понагляднее будет:
Код
int main() : before Foo goo = bar(); Foo& bar() : before Foo res(10); Foo::Foo(int) : 0x5c0e78 Foo& bar() : after Foo res(10); Foo& bar() : res.foo() : 10 Foo::~Foo() : 0x5c0e78 Foo::Foo(const Foo&) : 0x5c0e78 int main() : after Foo goo = bar(); int main() : goo.foo() : 6041520 Foo::~Foo() : 0x5c0e78
0
|
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
|
||||||
30.01.2012, 14:14 [ТС] | 6 | |||||
Ну он же копируется тогда? Блин.(((
Вот мой код:
//1.ф-я GetPoint -возвращает ссылку на объект TTo4ka //ибо чтоб не копировалась не создавалась. //2.если буду возвращать не ссылку а объект то будет тогда копироваться!! //3.если принимает ссылку не созданный локальный объект то программа ругается. //4. TTo4ka To4ka; - это тоже плохо. т.к. у меня создаются новые объекты типа TTo4ka в //локальной ф-и. Или не плохо это?
0
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|||||||||||
30.01.2012, 14:23 | 7 | ||||||||||
Кто вам такое сказал? Ну что ж теперь вообще не создавать ничего в функциях?
Не по теме: А то оперативка расплавиться :D Короче вот пример:
Или так:
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|||||||||||
30.01.2012, 14:27 | 8 | ||||||||||
Насколько я помню по предыдущей теме, проблем быть не должно, поскольку GetPoint ищет точку не в локальном массиве, следовательно, и ссылку она возвращает на не локальный (по отношению к ней) объект.
Если это вопрос, то да. Если констатация факта... не знаю, что сказать Нифига не понял Всё относительно. Плохо-не плохо... Сразу не сказать. Если функция выглядит так:
0
|
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
|
||||||
30.01.2012, 14:30 [ТС] | 9 | |||||
не совсем. вернее совсем нет. )) Ф-я выглядит так:
или его ссылку, или указатель на объект, дабы в другой ф-и можно было с ним работать. изменять и т.п. Но! Но хотелось бы все это действо провернуть ПРАВИЛЬНО не тратя лишней памяти и т.п.
0
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
30.01.2012, 14:33 | 10 |
Это вы называете "возвратить локальную переменную"!?!?
И почему если под переменную выделена память динамически, она вдруг становиться глобальной?!? nom - не указатель
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
30.01.2012, 14:34 | 11 |
Андрей2011, не всегда не тратя памяти значит правильно. Например,если в классе хранится строка, я предпочту в геттере вернуть её копию, а не константную ссылку на неё. Потому что константность легко можно отменить и прострелить себе ногу. Хотя всё, конечно, зависит от задачи (точнее даже, от требований).
0
|
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
|
||||||
30.01.2012, 14:43 [ТС] | 12 | |||||
Вот. Увжаемый, silent_1991, меня понял. Пусть и отчасти))
Просто получается вот какая штука. Объект TTo4ka содержит в себе штук 10 переменных и еще 2 массива по 4 элемента в каждом. А теперь представьте. Человек ставит "точку" (ход делает) и запусается эта ф-я. локальная. которая локально создает 4 такие вот точки потом их удаляет естественно. Т.е. ... память выделилась и она же вернулась. Но правильно ли это? все же на создание одного объекта уходит много байт. и я в книге Айрона Хортона сегодня прочитал что он в примере в своем делает такую штуку: Он, из ф-и возвращает ссылку на объект а принимает её, ссылку, указатель! т.е. как-то так:
Добавлено через 5 минут - это я называю возвратом ссылки на объект. - имелось ввиду что p_MassivTo4ek - указатель на массив.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
30.01.2012, 14:45 | 13 |
Андрей2011, я не совсем понял, о чём вы (как указатель может "принять" ссылку), но суть приёма снова не понимаю. Факт в том, что функции предназначены для выполнения некоторых локальных действий либо для преобразования информации. И возвращать из функции новый объект зачастую единственно правильное решение.
0
|
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
|
||||||
30.01.2012, 14:48 [ТС] | 14 | |||||
вот:
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
30.01.2012, 14:49 | 15 |
Андрей2011, а какая здесь разница между ссылкой и указателем (кроме отбрасывания синтаксических прелестей ссылок и вновь появившейся возможностью выстрелить себе в ногу)?
1
|
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
|
||||||
30.01.2012, 15:06 | 16 | |||||
0
|
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
|
|
30.01.2012, 15:10 [ТС] | 17 |
о как замутил. О_о
0
|
30.01.2012, 15:10 | |
30.01.2012, 15:10 | |
Помогаю со студенческими работами здесь
17
Совместное использование указателей и ссылок Реализация программы с использованием ссылок и указателей Объясните суть ссылок и указателей в коде Операции присвоения с использованием указателей и ссылок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |