Constructors are not called by us directly and the compiler is the one which takes care of calling it and the use of constructor is to initialize the member variables of the object.
Nope. That's not the reason. Constructors are called by us directly in many cases.
The real reason is that constrcutors are used to initialize the data members of the object. If, for some reason, an initialization fails, and you had a return type on the constructor, then you could return, never fix the problem, and go off with an improperly initialized object.
The absence of the return type forces you to throw exceptions when errors occur in a constructor. This stops the creation process of the object and forces you to deal with the problem.
Beginner C++ jockeys with a C background have been known to put an error code data member in the class. Then when their constructor croaks, they put the reason for the error in the error code data member in the object and return. Then they call some goofball method, like GetLastError(), to retrieve the error code. Now they can test the error code just like they did in C. Apologies to Microsoft, but this was a stupid thing to have done.