In C++03, a POD type gets default initialized if () is omitted otherwise it is value-initialized.
That is not exactly what happens.  According to the C++03 spec, section 8.5/9, if no initializer is specified for a non-static POD-type object, then it and its sub-objects "have an indeterminate initial value".  That is not the same thing as default-initialization.  Default-initialization is the same thing as value-initialization for a POD-type, which would mean the object is zero-initialized (8.5/5), but that can only happen with the presence of an empty initializer (i.e., empty-parenthesis per 8.5/7).  Thus you can only default and/or value-initialize a POD-type with an empty initializer.  Default initialization for a non-static POD-type does not happen when no initializer is specified.
In your second example, with the non-POD type that has the user-defined constructor, default-initialization would technically take place if you omitted the value-initializer (parenthesis) symbols.  In other words:
bar* ptr_a = new bar; //default initialization
bar* ptr_b = new bar(); //value initialization
Keep in mind though that with both non-POD struct or class-types, if there is a user-defined constructor, default-initialization and value initialization, per 8.5/5, both call the user-defined constructor.  So in the end, with the type bar as you've declared it, default and value initialization end up doing the same thing.