La segunda opción no es la inicialización sino la asignación. Con tipos que tienen constructores predeterminados definidos por el usuario, la segunda opción llamará al constructor predeterminado y más tarde llamará al operador de asignación (definido o no por el usuario) para asignar el valor.
Algunos tipos no pueden inicializarse por defecto: si tiene un atributo sin constructor predeterminado, mantiene referencias (constantes o no) o tiene atributos constantes, debe inicializarlos en la lista de inicializadores.
Las matrices pueden ser de valor inicializado en la lista de inicialización, pero no en el cuerpo del constructor:
class X {
public:
X() : array() {} // value-initializes the array
// equivalent to:
// X() { for (int i = 0; i < 10; ++i) array[i]=0; }
private:
int array[10];
};
Para los tipos de POD, se les puede valorar a inicializar en la lista de inicialización, pero no dentro de los corchetes:
class X {
public:
X() : pod() {} // value-initializes
// equivalent to (but easier to read and subtly faster as it avoids the copy):
// X() { pod = {}; }
private:
PODType pod;
};
Finalmente, algunas clases ofrecen funcionalidad mediante el uso de constructores que serán más complejos (si es posible) después de la construcción predeterminada.
class X
{
public:
X() : v(10) {} // construct a vector of 10 default initialized integers
// equivalent to:
// X() { for (int i = 0; i < 10; ++i) v.push_back(0); }
private:
std::vector<int> v;
};
Por último, cada vez que son equivalentes, las listas de inicialización son más idiomáticas en C++.
Obtener una prohibición en ese enlace. Supongo que esta es la razón por la que se desaconsejan las respuestas de solo enlace. – wvdz
Aquí está el enlace actual que explica por qué se prefieren las listas de inicializadores. https://isocpp.org/wiki/faq/ctors#init-lists – NigoroJr