C/C++

Вопрос по ООП на С++

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

int a;
double b;
хранятся на стеке. Как следует из названия, стек работает с переменными по схеме FILO (first in last out). Управление стеком происходит автоматически. При выходе переменной из области видимости, соответствующая ей в стеке память освобождается. Этот механизм позволяет разработчику не следить за удалением автоматических переменных. Стек работает очень быстро, но имеет ограниченный размер, который обычно не превосходит нескольких мегабайт.

Второй тип памяти - куча - устроен иначе. В куче объекты можно хранить в произвольном месте, создавать и удалять их в произвольном порядке, а размер кучи обычно значительно превосходит размер стека. Платить за эти преимущества приходится скоростью: работа с кучей происходит значительно медленнее, чем со стеком. Кроме того, объекты из кучи не удаляются автоматически.

Кучу имеет смысл использовать в двух случаях:

Необходимо хранить большой объект. Хранение больших объектов на стеке может привести к его переполнению (stack overflow).
Автоматическое управление памятью в стеке не соответствует логике программы. Чаще всего такая ситуация возникает, когда созданный объект должен продолжать свое существование после выхода из блока, в котором он был создан.
Дима Айсин
Дима Айсин
81 443
Лучший ответ
В первом случае объект находится в автоматической переменной pt, память для которой выделяется в стеке. При выходе из функции main объект будет автоматически удалён с автоматическим же вызовом деструктора.

Во втором случае объект создаётся в куче оператором new и его адрес записывается в переменную ptr. Никакого автоматического удаления объекта не производится. Чтобы удалить объект и вызвать деструктор необходимо явно написать delete ptr;.

Разница строк 20 и 23 в том, что pt - это сам объект, а ptr - указатель на объект.

Конструкция ptr->color() - это синтаксический сахар для (*ptr).color().
Влад Князев
Влад Князев
93 549
В данном конкретном примере это ничего не дает, разницы между указателем и объектом вы не заметите. Но давайте представим себе ситуацию, когда таких объектов у вас много и вам хочется иметь отсортированные по каким-то параметрам объекта последовательности. Допустим нужно точки отсортировать по Х и по Y
И вот тут оказывается, что если у вас массив объектов, то вам придется выбирать, по какому параметру их сортировать и сама сортировка займет очень много времени (потому что вам надо будет перемещать много-много раз сами объекты). А вот если сделать массив указателей на объекты, то перемещать при сортировке придется лишь указатель. Причем таких массивов можно сделать несколько и это не приведет к созданию дубликатов объектов. Т.е. использование указателей повзоляет в ряде случаев существенно повысить эффективность кода.
Александр Дивеев Спасибо большое