
C/C++
Чем координально отличается работа с объектами в строке 20 и с экземплярами в строке 23 (если я неправильно назвал эти понятия то поправьте). Тип да во втором случае у нас идет указатель на класс. Но что это дает? Можете подробно описать пожалуйста
Вопрос по ООП на С++

Программе на C++ доступны два вида памяти: стек и куча (heap). Автоматические переменные вроде
int a;
double b;
хранятся на стеке. Как следует из названия, стек работает с переменными по схеме FILO (first in last out). Управление стеком происходит автоматически. При выходе переменной из области видимости, соответствующая ей в стеке память освобождается. Этот механизм позволяет разработчику не следить за удалением автоматических переменных. Стек работает очень быстро, но имеет ограниченный размер, который обычно не превосходит нескольких мегабайт.
Второй тип памяти - куча - устроен иначе. В куче объекты можно хранить в произвольном месте, создавать и удалять их в произвольном порядке, а размер кучи обычно значительно превосходит размер стека. Платить за эти преимущества приходится скоростью: работа с кучей происходит значительно медленнее, чем со стеком. Кроме того, объекты из кучи не удаляются автоматически.
Кучу имеет смысл использовать в двух случаях:
Необходимо хранить большой объект. Хранение больших объектов на стеке может привести к его переполнению (stack overflow).
Автоматическое управление памятью в стеке не соответствует логике программы. Чаще всего такая ситуация возникает, когда созданный объект должен продолжать свое существование после выхода из блока, в котором он был создан.
int a;
double b;
хранятся на стеке. Как следует из названия, стек работает с переменными по схеме FILO (first in last out). Управление стеком происходит автоматически. При выходе переменной из области видимости, соответствующая ей в стеке память освобождается. Этот механизм позволяет разработчику не следить за удалением автоматических переменных. Стек работает очень быстро, но имеет ограниченный размер, который обычно не превосходит нескольких мегабайт.
Второй тип памяти - куча - устроен иначе. В куче объекты можно хранить в произвольном месте, создавать и удалять их в произвольном порядке, а размер кучи обычно значительно превосходит размер стека. Платить за эти преимущества приходится скоростью: работа с кучей происходит значительно медленнее, чем со стеком. Кроме того, объекты из кучи не удаляются автоматически.
Кучу имеет смысл использовать в двух случаях:
Необходимо хранить большой объект. Хранение больших объектов на стеке может привести к его переполнению (stack overflow).
Автоматическое управление памятью в стеке не соответствует логике программы. Чаще всего такая ситуация возникает, когда созданный объект должен продолжать свое существование после выхода из блока, в котором он был создан.
В первом случае объект находится в автоматической переменной pt, память для которой выделяется в стеке. При выходе из функции main объект будет автоматически удалён с автоматическим же вызовом деструктора.
Во втором случае объект создаётся в куче оператором new и его адрес записывается в переменную ptr. Никакого автоматического удаления объекта не производится. Чтобы удалить объект и вызвать деструктор необходимо явно написать delete ptr;.
Разница строк 20 и 23 в том, что pt - это сам объект, а ptr - указатель на объект.
Конструкция ptr->color() - это синтаксический сахар для (*ptr).color().
Во втором случае объект создаётся в куче оператором new и его адрес записывается в переменную ptr. Никакого автоматического удаления объекта не производится. Чтобы удалить объект и вызвать деструктор необходимо явно написать delete ptr;.
Разница строк 20 и 23 в том, что pt - это сам объект, а ptr - указатель на объект.
Конструкция ptr->color() - это синтаксический сахар для (*ptr).color().
В данном конкретном примере это ничего не дает, разницы между указателем и объектом вы не заметите. Но давайте представим себе ситуацию, когда таких объектов у вас много и вам хочется иметь отсортированные по каким-то параметрам объекта последовательности. Допустим нужно точки отсортировать по Х и по Y
И вот тут оказывается, что если у вас массив объектов, то вам придется выбирать, по какому параметру их сортировать и сама сортировка займет очень много времени (потому что вам надо будет перемещать много-много раз сами объекты). А вот если сделать массив указателей на объекты, то перемещать при сортировке придется лишь указатель. Причем таких массивов можно сделать несколько и это не приведет к созданию дубликатов объектов. Т.е. использование указателей повзоляет в ряде случаев существенно повысить эффективность кода.
И вот тут оказывается, что если у вас массив объектов, то вам придется выбирать, по какому параметру их сортировать и сама сортировка займет очень много времени (потому что вам надо будет перемещать много-много раз сами объекты). А вот если сделать массив указателей на объекты, то перемещать при сортировке придется лишь указатель. Причем таких массивов можно сделать несколько и это не приведет к созданию дубликатов объектов. Т.е. использование указателей повзоляет в ряде случаев существенно повысить эффективность кода.
Александр Дивеев
Спасибо большое
Похожие вопросы
- Вопрос к экзамену по ООП.
- Лабораторка по ООП
- Помогите с ООП на C++
- Самые значительные различия С и С++ ( Кроме наличия ООП )
- Лютый препод не унимается. Просит без ООП написать функцию обмена значениями переменных любого типа!
- Архитектурные трабблы при использовании ООП
- Тип треугольника ООП
- Создать метод который выводит все спектакли и дать их прохождения, которые состоятся в заданный день недели ООП
- Правда ли, что язык Си - это язык мертвый и никому не нужный, а Си++ - это кривое костыльное ООП, которое скоро умрет?
- Найдите сумму, разность и скалярное произведение двух векторов в N-мерном пространстве. Язык С++ ООП