http://www.cplusplus.com/forum/general/37962/
The first constructor - without parenthesis - provides what is called default initialization (do not confuse with default constructor). Default initialization leaves the values of fundamental types (int, double, etc) uninitialized, i.e. arbitrary. Therefore, with new Demo;
you get uninitialized chunk of memory with arbitrary values in the fields.
The second constructor - with parenthesis - provides what is called value initialization. Value initialization zeros fundamental types. Therefore, with new Demo();
you get zero-initialized chunk of memory - all fields in this case will be zeros.