Ver Mensaje Individual
  #5 (permalink)  
Antiguo 06/08/2014, 11:20
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: Duda sintaxis C++

Cita:
Iniciado por vangodp Ver Mensaje
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 original
  1. class B {
  2.    private:
  3.       int num;
  4.    public:
  5.       //declaración del constructor B
  6.       B(int);
  7. };
  8.  
  9. // definición del constructor B
  10. B::B(int n) {
  11.    num = n;
  12. }
  13.  
  14. class A {
  15.    private:
  16.       B b;
  17.    public:
  18.    // declaración del constructor de A
  19.    A(int);
  20. };
  21.  
  22. // definición del constructor A
  23. A::A(int n) {
  24.    b = B(n);
  25. }
  26.  
  27. int main() {
  28.    return 0;
  29. }
No es tan equivalente cuando lo anterio te da el siguiente error:
Código BASH:
Ver original
  1. prova.cpp: In constructor ‘A::A(int)’:
  2. prova.cpp:23:11: error: no matching function for call to ‘B::B()’
  3. prova.cpp:23:11: note: candidates are:
  4. prova.cpp:10:1: note: B::B(int)
  5. prova.cpp:10:1: note:   candidate expects 1 argument, 0 provided
  6. prova.cpp:1:7: note: B::B(const B&)
  7. 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 original
  1. class B {
  2.    private:
  3.       int num;
  4.    public:
  5.       //declaración del constructor B
  6.       B(int);
  7. };
  8.  
  9. // definición del constructor B
  10. B::B(int n) : num(n) {}
  11.  
  12. class A {
  13.    private:
  14.       B b;
  15.    public:
  16.    // declaración del constructor de A
  17.    A(int);
  18. };
  19.  
  20. // definición del constructor A
  21. A::A(int n) : b(B(n)) {}
  22.  
  23. int main() {
  24.    return 0;
  25. }

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!
__________________
github.com/xgbuils | npm/xgbuils