Действительно, переход на C ++ с языка, такого как Java или C #, может быть пугающим, я также прошел через это.
Первое и главное отличие состоит в том, что в C ++ вы почти всегда управляете своей собственной памятью. При создании объекта в куче вы несете ответственность за его удаление, чтобы он не пропускал память - это, в свою очередь, означает, что вы можете удалить его, когда считаете нужным. При создании объекта в стеке он автоматически удаляется при выходе из области видимости - вы должны быть осторожны, чтобы не использовать его после выхода из области видимости.
Пример:
void do_queue(B& queue)
{
Evt *e = new Evt;
queue.queueEvent(e);
} // all well, e can be popped and used (also must be deleted by someone else!)
против
void do_queue(B& queue)
{
Evt e;
queue.queueEvent(&e);
} // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg
При этом два метода также существенно различаются в одном аспекте: первый создает объект. Второй создает указатель на объект. Приятно иметь указатели в том, что вы можете передавать их как параметры, копируя в стек только минимальную память (указатель копируется вместо целого объекта). Конечно, вы всегда можете получить адрес объекта, выделенного в стеке, используя «&», или передать его в качестве ссылки - однако, при использовании объектов, выделенных в стеке, вы должны быть особенно осторожны с их областью действия.
Я нашел этот сайт отличным ресурсом, когда я перешел с Java на C ++: http://www.parashift.com/c++-faq-lite/ - вы, вероятно, тоже найдете его, он предлагает много хороших объяснений