Whatever you do, x_ is initialized before the opening brace. In the first case, it is initialized by the constructor that takes whatever, in the second case it is initialized by the default constructor.
Additionally in the second case, you're throwing away the results of initializating by using assignment.
(of course, if the type of x_ is non-class (e.g. int or double), default initialization is a no-op, and the two cases are functionally equivalent)
There is a reasonable case for preferring Fred::Fred() { x_ = whatever ; } over Fred::Fred() : x_(whatever) { }
for trivially default-constructible and and trivially-copyable types (for instance double).
1 2 3 4 5 6 7
struct A
{
explicit( int v ) : j(v+1), i(j+1) {} // bad, unintuitive; i is initialized before j
// change the order of declaration of i and j and meaning changes
int i ;
int j ;
}
If x_ is of a type that is not default-constructible or not assignable, (for inatance a constint)this does not work at all:
1 2
Fred::Fred() // *** error: const int is not default-constructible
{ x_ = whatever ; }// *** error: can't assign to const int