Ver Mensaje Individual
  #7 (permalink)  
Antiguo 15/05/2014, 05:24
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Programacion orientada a objetos

Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4. class Perro;
  5. class Perro {
  6.     public:
  7.         //Metodos constructores
  8.        
  9.         //Costructor por defecto
  10.         Perro () {
  11.             suEdad   = 0;
  12.             suPeso   = 0;
  13.             suNombre = "No tiene nombre";
  14.             suRaza   = "No tiene raza";
  15.         }
  16.        
  17.         //Constructor con parametros
  18.         Perro ( int unaEdad, int unPeso, string unNombre, string unaRaza ) {
  19.             suEdad   = unaEdad;
  20.             suPeso   = unPeso;
  21.             suNombre = unNombre;
  22.             suRaza   = unaRaza;
  23.         }
  24.        
  25.         //Constructor de copia
  26.         Perro ( Perro &unPerro ) {
  27.             suEdad   = unPerro.suEdad;
  28.             suPeso   = unPerro.suPeso;
  29.             suNombre = unPerro.suNombre;
  30.             suRaza   = unPerro.suRaza;
  31.         }
  32.        
  33.         //Metodos destructores
  34.         ~Perro() {} //destructor por defecto
  35.        
  36.         //metodos geters "obtener"
  37.         int    getEdad () const { return suEdad; }
  38.         int    getPeso () const { return suPeso; }
  39.         string getNombre() const { return suNombre; }
  40.         string getRaza () const { return suRaza;   }
  41.        
  42.         //Metodos seters "entrada de datos"
  43.         void setEdad ( int unaEdad ) { suEdad = unaEdad; }
  44.         void setPeso ( int unPeso ) { suPeso = unPeso;  }
  45.         void setNombre ( string unNombre ) { suNombre = unNombre; }
  46.         void setRaza ( string unaRaza ) { suRaza   = unaRaza;  }
  47.        
  48.         //Otros metodos
  49.         void ladrar() { std::cout << "aroof roof!XD" << endl; }
  50.        
  51.         //La parte privada de perro"No podemos acceder desde fuera de la clase"
  52.     private:
  53.         //Atributos
  54.         int    suEdad;
  55.         int    suPeso;
  56.         string suNombre;
  57.         string suRaza;
  58. }; //Fin de la idea perro "Esta es la clase no el objeto"
  59.  
  60. int main () {
  61.     system ( "MODE CON cols=100 lines=50" );
  62.    
  63.  
  64.     Perro miPerro;                              //Creamos copia de la clase Perro "Constructor por defecto"
  65.     Perro otroPerro ( 3, 7, "Rex", "Pitbull" ),Dog(otroPerro); //Creamos copia de la clase Perro "Constructor con parametros" ¡Y! Creamos otro Perro "Dog" usando el constructor de copias que hemos implementado ;)
  66.  
  67.     cout << miPerro.getNombre() << endl;        //miPerro no tiene ningun dato aparte de los de por defecto "No tiene Nombre"
  68.     cout << otroPerro.getNombre() << endl;      //otroPerro si tiene nombre y se llama Rex
  69.    
  70.     //Con es constructor de copia puedes hacerlo ;)
  71.     miPerro = otroPerro;                        //Mi perro ha ganado todos los datos de otroPerro "Constructor de copia"
  72.  
  73.     cout  << miPerro.getNombre() << "se llama miPerro, ahora tambien se llama Rex y es identico a otroPerro: " << endl;//Ahora miPerro tiene nombre que es igual al de otroPerro "Rex"
  74.    
  75.     cout  << "Este es Dog que es una copia de otroPerro y su nombre es: " << Dog.getNombre() << endl;
  76.    
  77.     //Puedes hacer copias del Perro que te apetesca usando el Constructor de copias.
  78.     //Algunos ejemplos
  79.     Perro unDog2(otroPerro);
  80.     Perro papaNatas = otroPerro;
  81.     Perro hotDog;
  82.     hotDog = otroPerro;
  83.     cout  << "unDog2: " << unDog2.getNombre() << endl;
  84.     cout  << "papaNatas: " << papaNatas.getNombre() << endl;
  85.     cout  << "hotDog: " << hotDog.getNombre() << endl;
  86.     cin.ignore();
  87. }

Poder se puede pero si no invocas al constructor de copias te va entrar los Datos por defecto por que es como hacer eso:

int num1 = 10, num2;

No tiene por que num2 tomar el valor de num1 a menos que haga eso:

int num1 = 10, num2 = num1;

recuerda que cpp hace la asignacion de de arriba abajo y de izquierda a derecha lo lo que esto: int num1 = 10, num2 = num1;

va en ese orden:

1º num1=10
2º num2=num1

Asi funciona mas o menos:
Perro otroPerro ( 3, 7, "Rex", "Pitbull" ),Dog(otroPerro);

Si le creo asi:
Perro otroPerro ( 3, 7, "Rex", "Pitbull" ),Dog;
no tiene por que ganar el valor de la izquierda de la coma ;), para eso necesitas un constructor de copias.
Si no elijes un constructor recuerda que va pillar siempre "El constructor por defecto" XDDD



https://www.youtube.com/watch?v=MDXbFIlVEb8