A constructor can call any non-virtual method. However, keep in mind that assignment and initialization are two different things in C++. In OP's original example, a better way to do that would be:
1 2 3
struct S {
S() : X( 7 ) {}
};
using an initializer list instead of an assignment.
I almost always add a private function named void Init() and I call it in every constructor and operator = . It makes initialization of many variables simple.
However, operator= calling an Init() method will provide only the basic exception guarantee, which is generally not preferred when a better implementation exists that provides a strong guarantee. See http://www.cplusplus.com/forum/articles/18749/ for details on an exception-safe (providing strong guarantee) assignment operator.