Cita:
Iniciado por vangodp Efectivamente es una forma de asignar valores a las variables miembro que pertenece a la misma clase. flags(MAT) es equivalente a flags = MAT; pero esta ultima iría dentro de las {}.
Conceptualmente es equivalente a lo que en otros lenguajes es asignar el objeto en el cuerpo del contructor. Pero, en C++, con lista de incializadores no te dará problemas con atributos que son objetos de otras clases mientras que de la manera común sí (Mírese la clase A con atributo de la clase B):
Código C++:
Ver originalclass B {
private:
int num;
public:
//declaración del constructor B
B(int);
};
// definición del constructor B
B::B(int n) {
num = n;
}
class A {
private:
B b;
public:
// declaración del constructor de A
A(int);
};
// definición del constructor A
A::A(int n) {
b = B(n);
}
int main() {
return 0;
}
No es tan equivalente cuando lo anterio te da el siguiente error:
Código BASH:
Ver originalprova.cpp: In constructor ‘A::A(int)’:
prova.cpp:23:11: error: no matching function for call to ‘B::B()’
prova.cpp:23:11: note: candidates are:
prova.cpp:10:1: note: B::B(int)
prova.cpp:10:1: note: candidate expects 1 argument, 0 provided
prova.cpp:1:7: note: B::B(const B&)
prova.cpp:1:7: note: candidate expects 1 argument, 0 provided
Mientras que este código con lista de inicializadores no.
Código C++:
Ver originalclass B {
private:
int num;
public:
//declaración del constructor B
B(int);
};
// definición del constructor B
B::B(int n) : num(n) {}
class A {
private:
B b;
public:
// declaración del constructor de A
A(int);
};
// definición del constructor A
A::A(int n) : b(B(n)) {}
int main() {
return 0;
}
Este concepto de lista de inicializadores al principio puede sonar extraño si vienes de otro tipo de lenguajes orientados a objetos. La diferencia con C++ es que la mayoría de lenguajes orientados a objetos usan memoria dinámica para reservar espacio para los objetos mientras que C++ usa la pila. De ahí, aparece la necesidad de este concepto.
Un saludo!