A class that doesn't have a constructor will not have a "constructor call" - or at least, the constructor will not fill any of the data inside the class.
Any data on the stack will have random content when the function is entered, no matter if it's a class or some other data.
new is generally based on malloc (or at least, it's normally using the same underlying mechanisms), and whilst malloc isn't guaranteed to clear the allocated memory, it is normally how it works. I've also seen debug versions of malloc that fill memory with "0xCC" or "0xAA" or some such, to make it easier to identify when using un-initialized data (zero tends to be pretty common, so if something is zero, you don't really know if it was set to zero or just "happened to be zero").
It is definitely good practice to either have a constructor, or fill the data by hand after using malloc/new.
But in practice, both methods of getting memory for the object (on stack or via new), both leave x as "undefined".