Indeed moving to C++ from a language like Java or C# can be daunting, I've gone through it as well.
The first and foremost difference is that in C++ you almost always manage your own memory. When creating an object on the heap you are responsible for deleting it so it does not leak memory - this in turn means you can delete it when you see fit. When creating an object on the stack, it is automatically deleted when it goes out of scope - you must be careful not to use it after it goes out of scope.
Example:
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!)
versus
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
That being said, the two methods are also significantly different in one aspect: the first one creates an object. The second one creates a pointer to an object. The nice thing about having pointers is that you can pass them around as parameters with only minimal memory being copied on the stack (the pointer is copied, instead of the whole object). Of course, you can always get the address of an object allocated on the stack by using "&", or pass it around as a reference - however, when using objects allocated on the stack you much be especially careful with their scope.
I've found this website a great resource when I moved from Java to C++: http://www.parashift.com/c++-faq-lite/ - you will probably find it too, it offers a lot of good explanations