Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

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

Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается? Разыминованый указатель имеет иной адрес?
Т.е. есть адрес объекта номер 1, и есть адрес значения объекта номер 1 (и в данной ситуации мы просто присваиваем ссылку на значение объекта номер 1) или как?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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;//но тут красивше и не нужно дополнительной
1
22.04.2013, 14:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2013, 14:19
Привет! Вот еще темы с ответами:

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей - C++
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Различия указателей char* от указателей других типов - C++
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

Как обойтись без указателей и указателей на указатель? - C++
Ибо не совсем выходит понять,что на что тут указывает #include "stdafx.h" #include <iostream> #include <stdlib.h> using namespace...

Создание массивов указателей на массивы указателей - C++
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор ругается на то что не может...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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