/* 1 */ Foo* foo1 = new Foo ();
Creates an object of type Foo in dynamic memory. foo1 points to it. Normally, you wouldn’t use raw pointers in C++, but rather a smart pointer. If Foo was a POD-type, this would perform value-initialization (it doesn’t apply here).
/* 2 */ Foo* foo2 = new Foo;
Identical to before, because Foo is not a POD type.
/* 3 */ Foo foo3;
Creates a Foo object called foo3 in automatic storage.
/* 4 */ Foo foo4 = Foo::Foo();
Uses copy-initialization to create a Foo object called foo4 in automatic storage.
/* 5 */ Bar* bar1 = new Bar ( *new Foo() );
Uses Bar‘s conversion constructor to create an object of type Bar in dynamic storage. bar1 is a pointer to it.
/* 6 */ Bar* bar2 = new Bar ( *new Foo );
Same as before.
/* 7 */ Bar* bar3 = new Bar ( Foo foo5 );
This is just invalid syntax. You can’t declare a variable there.
/* 8 */ Bar* bar3 = new Bar ( Foo::Foo() );
Would work and work by the same principle to 5 and 6 if bar3 wasn’t declared on in 7.
5 & 6 contain memory leaks.
Syntax like new Bar ( Foo::Foo() ); is not usual. It’s usually new Bar ( (Foo()) ); – extra parenthesis account for most-vexing parse. (corrected)