I read some of the posts about class constructors and they seem to confirm my feeling that in a microcontroller setting it is safer to use a public Init() method, with or without parameters, instead of class constructors because this gives you more control over the order in which initialisation takes place. And this order can be very important if it, directly or indirectly, involves hardware settings such as pinmode.
I made a robot arm program with about 12 classes and gave them all an Init() method. It may look slightly clumsy c++ this way but it is safer. And not slower or harder to read at all. By the way I am an experienced industrial c++ programmer.
A constructor should construct a object, not initialize the associated hardware. These are two different things and they should be kept separated (single responsibility). Furthermore you can not return a result from a constructor. But what if the initialization fails? In the embedded context we usually don't have exceptions, so I'm all in for the Init() method.
The Arduino run-time environment doesn't get initialized until the 'init()' function is called just before your setup() function is called. Global objects are constructed before that so it is generally unsafe to use any Arduino core functions in the constructor of an object that might be global. Also, any hardware registers set in such a constructor might be overwritten when the Arduino environment is initialized so those aren't safe either. In the constructor you should therefore not call any Arduino core (or library) functions or modify any hardware registers.
BUT, to be extra clear, there is nothing wrong with doing ALL the initialization in the construction for objects that are created dynamically, using "new", or created as local (stack-based) objects within any user function.