Puedes leer un poco
aquí.
Para que te quede un poco más claro supón que tienes la siguiente clase:
Código C++:
Ver originalclass MyInt{
public:
MyInt(int n){}
};
Como puedes ver, la única forma de construir un objeto MyInt es pasando un parámetro int al constructor, esto es:
Código C++:
Ver originalMyInt mi(3); // bien!
MyInt mi; // mal! No hay definido un constructor por defecto
Ahora supón que tienes otra clase que utiliza un objeto de MyInt:
Código C++:
Ver originalclass MyInt{
public:
MyInt(int n){}
};
class Other{
MyInt mi;
public:
Other(){}
};
int main(){
Other ot;
}
Intenta correr éste último código, aparentemente está bien, pero verás que el compilador intenta inicializar el objeto MyInt con el constructor por defecto (cosa que ya vimos no es posible). Ahora, intenta hacerlo como dices (en el cuerpo del constructor de la clase Other), ¿Qué pasa? ¿Tampoco verdad? Bien, para eso tienes la lista de inicializadores del constructor, para cuando necesitas inicializar objetos justo antes de entrar al cuerpo del constructor:
Código C++:
Ver originalclass MyInt{
public:
MyInt(int n){}
};
class Other{
MyInt mi;
public:
Other(): mi(5){}
};
int main(){
Other ot;
}
Por último, lo que sucede con los tipos primitivos es que puedes inicializarlos de ambas formas:
Código C++:
Ver originalint n = 10; //asigna 10 a n
int m(10); //asigna 10 a m
Por lo que fácilmente podrás encontrar ejemplos por el estilo de:
Código C++:
Ver originalclass MyInt{
int n;
public:
MyInt(int i) : n(i) {}
};