How can I use reference of a Class type which doesnt have a no argument default constructor as a member variable in another class ?
By storing an X reference member, there is the implication that this member is not owned by the Y object. Consequently, I would expect the Y constructor to take an X&, and then use this argument to initialise the reference member. You probably want to either implement the copy constructor in a similiar way, or disable it by declaring it as a private member. You should also probably just declare as private the copy assignment operator.

However although this works but I wonder and not sure too how much logical and leagal and structured this code is (my intention is safe null reference somehow).
It's legal, but then your Y object now pretty much has ownership over the X object in question, so you should simply store an object or a (smart) pointer instead of a reference.