Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
#1

Применение указателей - C++

22.04.2013, 02:50. Просмотров 1978. Ответов 21
Метки нет (Все метки)

Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему:
C++
1
Distance& dist = *(new Distance);
После чего можно обращаться к объекту через операцию точки, а не "->".

Disntace - класс. Операция new выделяет место равное объекту класса Distance и возвращает указатель на блок памяти, который выделили мы у операционной системы.
Не могу понять к чему там ссылка (знак амперсанда ) и к чему там операция разыменования. Каким образом оно работает?

Объясните пожалуйста саму схему данного выражения. Обязательно плюсану на спасибо. Благодарю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2013, 02:50     Применение указателей
Посмотрите здесь:

Применение и удаление указателей - C++
Здравствуйте. Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти. Есть указатель: int...

применение указателей, структур и объединений - C++
Здравствуйте, люди добрые!! (^_^)/ Очень нуждаюсь в вашей помощи... Помогите разобраться студентке!! (Y_Y)(^o^)/ Задание...

Применение - C++
Возможно вы посчитаете данный вопрос глупым. Но я его задам. Где можно применять C++ и C программисту, при этом не используя GUI? И...

применение c++ - C++
в 1 семестре начали проходить с++ за сем дошли до указателей (во 2 их начнем) прошли: типы, константы, операции, функции (передача по...

Практическое применение c++ - C++
Решил изучить с++, но столкнулся со следующей проблемой: как программы на этом языке применяются на практике? При изучении с# находил...

Применение метапрограммирования - C++
Доброго времени суток форумчане. Собственно говоря, как часто применимо метапрограммирование в современном мире разработок на C++. И имеет...

Применение ООП - C++
добрый день. вот написал небольшой класс по работе с матрицами. он пока делает : присваивание значений матриц, удаление, ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Модератор
Эксперт CЭксперт С++
7178 / 4344 / 634
Регистрация: 29.11.2010
Сообщений: 11,822
22.04.2013, 03:02     Применение указателей #2
Обычное разыменовывание указателя, new выделяет память и возвращает указатель, далее он разыменовывается и получается ссылка на объект Distance, а т.к. -> используется заместо (*...). тут он уже не требуется.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,494
Записей в блоге: 4
22.04.2013, 04:07     Применение указателей #3
IvanInanovich, разыменуя указатель можно получить значение на которое можно сослаться. Однако памятуя, что объект создан динамически его нужно будет потом уничтожить. Так например:
C++
1
2
3
4
Distance& dist = *(new Distance);
//что-то происходит...
Distance *distKiller=&dist;
delete  distKiller;
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 09:16     Применение указателей #4
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему:
C++
1
Distance& dist = *(new Distance);
После чего можно обращаться к объекту через операцию точки, а не "->".
Disntace - класс. Операция new выделяет место равное объекту класса Distance и возвращает указатель на блок
, который сразу же разыменуется и присваивается ссылке. Выстрел в ногу: динамическая память должна принудительно удаляться оператором delete, а к ссылкам он не применим.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
22.04.2013, 09:28     Применение указателей #5
IGPIGP, так тоже сработает
C++
1
2
3
Distance& dist = *(new Distance);
//что-то происходит...
delete&  dist;
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 10:08     Применение указателей #6
Кудаив, Вы главное не спутайте, что & применяется к dist, а не к delete. Хоть такая запись как у Вас тоже будет синтаксически разобрана корректно.
По теме: приведение указателя к ссылке лишь для того, чтобы вместо -> писать . довольно глупая затея.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
22.04.2013, 10:11     Применение указателей #7
Tulosba, да я не путаю привычка так писать
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 11:04     Применение указателей #8
Кудаив, как-ибудь напишете
C++
1
a & b
смысл будет вовсе не во взятии адреса
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
22.04.2013, 11:15     Применение указателей #9
Tulosba, о нет - только не побитовое и
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 11:23     Применение указателей #10
Кудаив, с чего Вы взяли, что это побитовое И? Это ссылка с именем b на объект типа a
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
22.04.2013, 11:41     Применение указателей #11
Tulosba, чтоб понять что это контекста маловато))
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 11:47     Применение указателей #12
Цитата Сообщение от Кудаив Посмотреть сообщение
чтоб понять что это контекста маловато))
Вот поэтому и стоит располагать операторы ближе к той сущности, к которой они должны относиться по замыслу автора.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,494
Записей в блоге: 4
22.04.2013, 12:51     Применение указателей #13
Цитата Сообщение от Кудаив Посмотреть сообщение
IGPIGP, так тоже сработает
Конечно. Операция взятия адреса всё равно предполагает создание временной переменной.
Но понятнее всё же через указатель.
Цитата Сообщение от taras atavin Посмотреть сообщение
Выстрел в ногу: динамическая память должна принудительно удаляться оператором delete, а к ссылкам он не применим.
Дело вкуса. Тут же не только в необходимости разыменования дело. Допустим нужно локально создать ссылку для последующей модификации в функции которая принимает ссылку. Можно конечно в и аргументе написать: &*
но это вряд ли хорошо читать. А потом ещё использовать результат... Так что может кому-то понравится и так как предложено. Мне лично это не нравится.
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 14:13  [ТС]     Применение указателей #14
Благодарю ребят за разъяснения.
Хотелось бы уточнить один момент.

Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается? Разыминованый указатель имеет иной адрес?
Т.е. есть адрес объекта номер 1, и есть адрес значения объекта номер 1 (и в данной ситуации мы просто присваиваем ссылку на значение объекта номер 1) или как?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2013, 14:19     Применение указателей
Еще ссылки по теме:

Применение цикла for - C++
Недавно начал учить C++, дошел до циклов. while, do while понимаю, а вот for ну хоть убей не понимаю, вроде был разобрался, а потом снова...

применение typedef - C++
Какова роль "*node"(последняя строка) в данном случае? typedef struct rbtree_node { enum color color; void *key; void *value; ...

Применение итераторов - C++
Подскажите пожалуйста, в чем практичность итераторов, то бишь для чего нужны они в программах?

Применение цикла do-while - C++
Здравствуйте. Хочу зациклить выполнение функции до тех пор, пока не будет выполнено условие, но не получается. Программа успешно...

Рекурсия и её применение - C++
Такая задачка попалась: Напишите программу, которая запрашивает число и показатель степени. Напишите рекурсивную функцию, которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,494
Записей в блоге: 4
22.04.2013, 14:19     Применение указателей #15
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается?
Ссылка должна инициализироваться значением в момент создания. То есть код:
C++
1
2
3
4
Distance& dist = *(new Distance);
//что-то происходит...
Distance *distKiller=&dist;
delete  distKiller;
эквивалентен коду:
C++
1
2
3
4
5
Distance *dist_ptr = new Distance;
Distance& distRef = *dist_ptr;//создание ссылки - доп инструкция, но не доп память))
//что-то происходит...
 
delete  dist_ptr;//но тут красивше и не нужно дополнительной
Yandex
Объявления
22.04.2013, 14:19     Применение указателей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru