Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con constructor C++

Estas en el tema de Duda con constructor C++ en el foro de C/C++ en Foros del Web. Hola a todos, hace poco que he empezado a leer sobre programación en C++ y me ha surgido una duda con un código que he ...
  #1 (permalink)  
Antiguo 03/12/2012, 17:37
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 meses
Puntos: 6
Duda con constructor C++

Hola a todos,

hace poco que he empezado a leer sobre programación en C++ y me ha surgido una duda con un código que he visto en un libro. Es la primera vez que viene esta construcción y por desgracia no viene explicada.

En el siguiente código,
Código C++:
Ver original
  1. class S
  2. {
  3. int x;
  4.  
  5. public:
  6. int getValue() { return x; }
  7. void setValue(int temp) { x = temp; }
  8. S(int temp) : x(temp) {}
  9. ~S() {}
  10. };

¿cuál es el significado de la línea 8?

Código:
S(int temp) : x(temp){}
Muchas gracias de antemano,
gonzo

Última edición por gonzo13; 03/12/2012 a las 17:46
  #2 (permalink)  
Antiguo 03/12/2012, 18:11
Avatar de ZeKi  
Fecha de Ingreso: noviembre-2012
Ubicación: Jaén
Mensajes: 61
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Duda con constructor C++

La linea 8 contempla el constructor de la clase S, quizá lo que no entiendas es el x(temp). Es la forma que tiene de inicializar el atributo x, está llamando al constructor por defecto del objeto int. Es la forma en la que se deben inicializar los objetos, por ejemplo, tenemos dos objetos, obj1 y obj2, y en obj1 hay un atributo que es un obj2, entonces, cuando llamemos al constructor de obj1, el obj2 lo deberemos incializar así:

Código C++:
Ver original
  1. obj1 (parametros): obj2(parametros){
  2.   //inicialización de obj1;
  3. }
  #3 (permalink)  
Antiguo 04/12/2012, 06:24
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Duda con constructor C++

Gracias ZeKi, pero sigo sin entender por qué la asignación se hace ahí tras los dos puntos y no dentro del cuerpo del método. Imagino que será por lo que tu comentas, que es bastante coherente, pero creo que necesito un poco más de explicación y paciencia.

Muchas gracias,
gonzo
  #4 (permalink)  
Antiguo 04/12/2012, 08:28
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Respuesta: Duda con constructor C++

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 original
  1. class MyInt{
  2.     public:
  3.     MyInt(int n){}
  4. };

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 original
  1. MyInt mi(3); // bien!
  2. 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 original
  1. class MyInt{
  2.     public:
  3.     MyInt(int n){}
  4. };
  5.  
  6. class Other{
  7.     MyInt mi;
  8.     public:
  9.     Other(){}
  10. };
  11.  
  12. int main(){
  13.     Other ot;
  14. }

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 original
  1. class MyInt{
  2.     public:
  3.     MyInt(int n){}
  4. };
  5.  
  6. class Other{
  7.     MyInt mi;
  8.     public:
  9.     Other(): mi(5){}
  10. };
  11.  
  12. int main(){
  13.     Other ot;
  14. }

Por último, lo que sucede con los tipos primitivos es que puedes inicializarlos de ambas formas:

Código C++:
Ver original
  1. int n = 10; //asigna 10 a n
  2. int m(10); //asigna 10 a m

Por lo que fácilmente podrás encontrar ejemplos por el estilo de:

Código C++:
Ver original
  1. class MyInt{
  2.     int n;
  3.     public:
  4.     MyInt(int i) : n(i) {}
  5. };
  #5 (permalink)  
Antiguo 07/12/2012, 03:57
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Duda con constructor C++

Muchísimas gracias fightmx. Ya me ha quedado totalmente claro.

Etiquetas: constructor, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:57.