Действительно, переход на 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/ - вы, вероятно, тоже его найдете, он предлагает много хороших объяснений
person
laura
schedule
05.01.2010