You are on page 1of 14

tutorialesya.com.

ar

http://www.tutorialesya.com.ar/cmasmasya/detalleconcepto.php?punto=13&codigo=140&inicio=0

13 - Declaracin de una clase y definicin de objetos


La programacin orientada a objetos se basa en la programacin de clases; a diferencia de la programacin
estructurada, que est centrada en las funciones.
Una clase es un molde del que luego se pueden crear mltiples objetos, con similares caractersticas.
Una clase es una plantilla (molde), que define atributos (variables) y mtodos (funciones)
La clase define los atributos y mtodos comunes a los objetos de ese tipo, pero luego, cada objeto tendr sus
propios valores y compartirn las mismas funciones.
Debemos crear una clase antes de poder crear objetos (instancias) de esa clase. Al crear un objeto de una clase,
se dice que se crea una instancia de la clase o un objeto propiamente dicho.
La estructura de una clase la veremos mediante un ejemplo.

Problema 1:
Confeccionar una clase que permita cargar el nombre y la edad de una persona. Mostrar los datos cargados.
Imprimir un mensaje si es mayor de edad (edad>=18) o no

Empleando la metodologa de resolver todo en la main (es decir lo que hemos vista hasta
ahora)
Programa:
#include <iostream>
using namespace std;
void main()
{
char nombre[40];
int edad;
cout <<"Ingrese nombre:";
cin.getline(nombre,40);
cout <<"Ingrese edad:";
cin >>edad;
cout <<"Nombre:";
cout <<nombre;
cout <<"\n";
cout <<"Edad:";
cout <<edad;
cout <<"\n";
if (edad>=18)
{
cout <<"Es mayor de edad.";
}
else
{

cout <<"No es mayor de edad.";


}
cin.get();
cin.get();
}

Empleando la definicin de una clase y creacin de un objeto.


Programa:
#include <iostream>
using namespace std;
class Persona {
private:
char nombre[40];
int edad;
public:
void inicializar();
void imprimir();
void esMayorEdad();
};
void Persona::inicializar()
{
cout <<"Ingrese nombre:";
cin.getline(nombre,40);
cout <<"Ingrese edad:";
cin >>edad;
}
void Persona::imprimir()
{
cout <<"Nombre:";
cout <<nombre;
cout <<"\n";
cout <<"Edad:";
cout <<edad;
cout <<"\n";
}
void Persona::esMayorEdad()
{
if (edad>=18)
{
cout <<"Es mayor de edad.";
}
else
{
cout <<"No es mayor de edad.";
}
cin.get();

cin.get();
}
void main()
{
Persona persona1;
persona1.inicializar();
persona1.imprimir();
persona1.esMayorEdad();
}
Este proyecto lo puede descargar en un zip desde este enlace : ClasePersona
Como podemos ver en un principio nos puede asustar la metodologa de resolver los problemas empleando
clases. Hay que tener en cuenta que la programacin orientada a objetos es conveniente cuando tenemos que
resolver problemas de mediana o gran complejidad (podemos hablar de miles o cientos de miles de lneas)
Lo primero que hacemos es la declaracin de la clase con la siguiente sintaxis:
class Persona {
private:
char nombre[40];
int edad;
public:
void inicializar();
void imprimir();
void esMayorEdad();
};
Luego de la palabra clave class indicamos el nombre de la clase.
Normalmente una clase tiene un nombre relacionada a lo que representa en si (si hacemos una calculadora es
muy posible que una clase se llame "Calculadora")
Un nombre de clase debe empezar con un caracter (normalmente en maysculas) y seguido de otros caracteres
o nmeros (no puede tener espacios en blanco)
La declaracin de una clase tiene dos secciones donde definimos atributos (que son las variables) y los mtodos
(especificamos los nombres de las funciones que implementar la clase)
Como podemos ver hay una seccin que se le antecede la palabra private: y otra que se le anteceder la palabra
clave public:
Desde la main solo tendremos acceso a lo que definamos en la seccin public.
Es importante el punto y coma que lleva la llave de cerrado de la clase para que no haya un error sintctico.
Seguidamente se implementan las funciones o mtodos de la clase:
void Persona::inicializar()
{
cout <<"Ingrese nombre:";
cin.getline(nombre,40);
cout <<"Ingrese edad:";
cin >>edad;
}
void Persona::imprimir()

{
cout
cout
cout
cout
cout
cout

<<"Nombre:";
<<nombre;
<<"\n";
<<"Edad:";
<<edad;
<<"\n";

}
void Persona::esMayorEdad()
{
if (edad>=18)
{
cout <<"Es mayor de edad.";
}
else
{
cout <<"No es mayor de edad.";
}
cin.get();
cin.get();
}
Cada mtodo o funcin resuelve una parte de nuestro problema, por ejemplo para la carga del nombre de la
persona y su edad hemos planteado la funcin inicializar:
void Persona::inicializar()
{
cout <<"Ingrese nombre:";
cin.getline(nombre,40);
cout <<"Ingrese edad:";
cin >>edad;
}
Para definir un mtodo a semejanza de la main comenzamos con la palabra clave void, seguida del nombre de la
clase, luego dos puntos y el nombre del mtodo.
Dentro del mtodo o funcin tenemos acceso a los atributos definidos en la zona private de la clase (es decir las
variables nombre y edad)
El mtodo imprimir muestra el contenido de los atributos nombre y edad que cargamos en el mtodo inicializar:
void Persona::imprimir()
{
cout <<"Nombre:";
cout <<nombre;
cout <<"\n";
cout <<"Edad:";
cout <<edad;
cout <<"\n";
}
Los tres mtodos tienen todo el algoritmo que anteriormente implementabamos todo en la main (esto veremos
que nos permite desarrollar programas mucho ms fciles de entender)
Veamos ahora que hacemos en la main:

void main()
{
Persona persona1;
persona1.inicializar();
persona1.imprimir();
persona1.esMayorEdad();
}
Primero definimos un objeto llamado persona1 de la clase Persona:
Persona persona1;
La definicin de un objeto es similar a la definicin de una variable (por ejemplo para definir una variable entera
hacemos : int valor)
La variable persona1 reserva espacio para almacenar el nombre y la edad.
Para llamar a los mtodos o funciones debemos anteceder el nombre del objeto:
persona1.inicializar();
persona1.imprimir();
persona1.esMayorEdad();

Problema 2:
Modificar el problema anterios para realizar la carga del nombre y la edad de dos personas. Mostrar los datos
cargados. Imprimir un mensaje si son mayor de edad o no.

Programa:
#include <iostream>
using namespace std;
class Persona {
private:
char nombre[40];
int edad;
public:
void inicializar();
void imprimir();
void esMayorEdad();
};
void Persona::inicializar()
{
cout <<"Ingrese nombre:";
cin.getline(nombre,40);
cout <<"Ingrese edad:";
cin >>edad;
}
void Persona::imprimir()
{
cout <<"Nombre:";

cout
cout
cout
cout
cout

<<nombre;
<<"\n";
<<"Edad:";
<<edad;
<<"\n";

}
void Persona::esMayorEdad()
{
if (edad>=18)
{
cout <<"Es mayor de edad.";
}
else
{
cout <<"No es mayor de edad.";
}
cout <<"\n";
}
void main()
{
Persona persona1;
Persona persona2;
persona1.inicializar();
cin.get();
persona2.inicializar();
persona1.imprimir();
persona1.esMayorEdad();
persona2.imprimir();
persona2.esMayorEdad();
cin.get();
cin.get();
}
Este proyecto lo puede descargar en un zip desde este enlace : ClasePersona2
Lo ms importante es notar que bsicamente lo nico que cambia es la definicin de dos objetos de la clase
Persona en la main:
Persona persona1;
Persona persona2;
Un cambio que hemos tenido que hacer es la llamada al mtodo get del objeto cin luego de inicializar los datos
de la primera persona (esto es necesario porque cuando cargamos la edad por teclado queda en el buffer un
"enter" que ser tomado en la carga del nombre de la segunda persona(para evitar esto hacemos esta llamada a
get)
Luego hemos sacado al final de la main las llamadas a get.
La clase no vara solo la definicin de dos objetos y las llamadas a los mtodos respectivos de cada objeto
(recordemos que una clase es un molde del cual podemos luego definir tantos objetos como sean necesarios)

Problema 3:
Desarrollar un programa que cargue los lados de un tringulo e implemente los siguientes mtodos: inicializar los

atributos, imprimir el valor del lado mayor y otro mtodo que muestre si es equiltero o no.

Programa:
#include<iostream>
using namespace std;
class Triangulo {
private:
int lado1,lado2,lado3;
public:
void inicializar();
void ladoMayor();
void esEquilatero();
};
void Triangulo::inicializar()
{
cout <<"Ingrese primer lado:";
cin >>lado1;
cout <<"Ingrese segundo lado:";
cin >>lado2;
cout <<"Ingrese tercer lado:";
cin >>lado3;
}
void Triangulo::ladoMayor()
{
cout <<"Lado mayor:";
if (lado1 > lado2 && lado1 > lado3)
{
cout <<lado1;
}
else
{
if (lado2 > lado3)
{
cout <<lado2;
}
else
{
cout <<lado3;
}
}
cout <<"\n";
}
void Triangulo::esEquilatero()
{
if (lado1==lado2 && lado1==lado3)
{
cout <<"Es un triangulo equilatero";

}
else
{
cout <<"No es un triangulo equilatero";
}
cin.get();
cin.get();
}
void main()
{
Triangulo triangulo1;
triangulo1.inicializar();
triangulo1.ladoMayor();
triangulo1.esEquilatero();
}
Este proyecto lo puede descargar en un zip desde este enlace : ClaseTriangulo
El nombre de la clase es Triangulo y requiere definir tres atributos de tipo entero donde almacenamos los valores
de los lados del tringulo:
int lado1,lado2,lado3;
Declaramos la cabecera de los tres mtodos requeridos para resolver el problema. Los declaramos en la seccin
public para poder llamarlos desde la main:
void inicializar();
void ladoMayor();
void esEquilatero();
No debemos olvidar el punto y como que requiera el cerrado de la declaracin de la clase:
};
El primer mtodo que deber llamarse desde la main es el inicializar donde cargamos los tres atributos por
teclado:
void Triangulo::inicializar()
{
cout <<"Ingrese primer lado:";
cin >>lado1;
cout <<"Ingrese segundo lado:";
cin >>lado2;
cout <<"Ingrese tercer lado:";
cin >>lado3;
}
El mtodo ladoMayor muestra el valor mayor de los tres enteros ingresados:
void Triangulo::ladoMayor()
{
cout <<"Lado mayor:";
if (lado1 > lado2 && lado1 > lado3)
{
cout <<lado1;
}

else
{
if (lado2 > lado3)
{
cout <<lado2;
}
else
{
cout <<lado3;
}
}
cout <<"\n";
}
Como podemos observar cuando un problema se vuelve ms complejo es ms fcil y ordenado separar los
distintos algoritmos en varios mtodos y no codificar todo en la main.
El ltimo mtodo de esta clase verifica si los tres enteros ingresados son iguales:
void Triangulo::esEquilatero()
{
if (lado1==lado2 && lado1==lado3)
{
cout <<"Es un triangulo equilatero";
}
else
{
cout <<"No es un triangulo equilatero";
}
cin.get();
cin.get();
}
En la main creamos un objeto de la clase Triangulo y llamamos los mtodos respectivos (podemos llamarlos ya
que los declaramos en la seccin public de la clase):
void main()
{
Triangulo triangulo1;
triangulo1.inicializar();
triangulo1.ladoMayor();
triangulo1.esEquilatero();
}

Problema 4:
Desarrollar una clase que represente un punto en el plano y tenga los siguientes mtodos: cargar los valores de x
e y, imprimir en que cuadrante se encuentra dicho punto (concepto matemtico, primer cuadrante si x e y son
positivas, si x<0 e y>0 segundo cuadrante, etc.)

Programa:
#include<iostream>
using namespace std;

class Punto {
private:
int x,y;
public:
void inicializar();
void imprimirCuadrante();
};
void Punto::inicializar()
{
cout <<"Ingrese coordenada x :";
cin >>x;
cout <<"Ingrese coordenada y :";
cin >>y;
}
void Punto::imprimirCuadrante()
{
if (x>0 && y>0)
{
cout <<"Se encuentra en el primer cuadrante.";
}
else
{
if (x<0 && y>0)
{
cout <<"Se encuentra en el segundo cuadrante.";
}
else
{
if (x<0 && y<0)
{
cout <<"Se encuentra en el tercer cuadrante.";
}
else
{
if (x>0 && y<0)
{
cout <<"Se encuentra en el cuarto cuadrante.";
}
else
{
cout <<"El punto no est en un cuadrante.";
}
}
}
}
cin.get();
cin.get();
}
void main()
{

Punto punto1;
punto1.inicializar();
punto1.imprimirCuadrante();
}
Este proyecto lo puede descargar en un zip desde este enlace : ClasePunto
La clase la llamamos Punto y en la declaracin definimos dos atributos y dos mtodos:
class Punto {
private:
int x,y;
public:
void inicializar();
void imprimirCuadrante();
};

El mtodo inicializar pide cargar por teclado las coordenadas x e y:


void Punto::inicializar()
{
cout <<"Ingrese coordenada x :";
cin >>x;
cout <<"Ingrese coordenada y :";
cin >>y;
}
El segundo mtodo mediante un conjunto de if verificamos en que cuadrante se encuentra el punto ingresado:
void Punto::imprimirCuadrante()
{
if (x>0 && y>0)
{
cout <<"Se encuentra en el primer cuadrante.";
}
else
{
if (x<0 && y>0)
{
cout <<"Se encuentra en el segundo cuadrante.";
}
else
{
if (x<0 && y<0)
{
cout <<"Se encuentra en el tercer cuadrante.";
}
else
{
if (x>0 && y<0)
{
cout <<"Se encuentra en el cuarto cuadrante.";
}
else

{
cout <<"El punto no est en un cuadrante.";
}
}
}
}
cin.get();
cin.get();
}
La main no tiene grandes diferencias con los problemas realizados anteriormente, definimos un objeto de la clase
Punto, y llamamos a los mtodos inicializar e imprimirCuadrante:
void main()
{
Punto punto1;
punto1.inicializar();
punto1.imprimirCuadrante();
}

Problema 5:
Desarrollar una clase que represente un Cuadrado y tenga los siguientes mtodos: cargar el valor de su lado,
imprimir su permetro y su superficie.

Programa:
#include<iostream>
using namespace std;
class Cuadrado {
private:
int lado;
public:
void inicializar();
void imprimirPerimetro();
void imprimirSuperficie();
};
void Cuadrado::inicializar()
{
cout <<"Ingrese el valor del lado:";
cin >>lado;
}
void Cuadrado::imprimirPerimetro()
{
int perimetro;
perimetro=lado*4;
cout <<"El perimetro es ";
cout <<perimetro;
cout <<"\n";
}

void Cuadrado::imprimirSuperficie()
{
int superficie;
superficie=lado*lado;
cout <<"La superficie es ";
cout <<superficie;
}
void main()
{
Cuadrado cuadrado1;
cuadrado1.inicializar();
cuadrado1.imprimirPerimetro();
cuadrado1.imprimirSuperficie();
cin.get();
cin.get();
}
Este proyecto lo puede descargar en un zip desde este enlace : ClaseCuadrado
En este problema es interesante ver como no definimos dos atributos donde se almacenan la superficie y el
permetro del cuadrado, esto debido a que solo estos datos se los requiere en el mtodo donde se imprimen (se
definen variables locales a dichos mtodos):
void Cuadrado::imprimirPerimetro()
{
int perimetro;
perimetro=lado*4;
cout <<"El perimetro es ";
cout <<perimetro;
cout <<"\n";
}
void Cuadrado::imprimirSuperficie()
{
int superficie;
superficie=lado*lado;
cout <<"La superficie es ";
cout <<superficie;
}

Esto significa que la variable perimetro es una variable local al mtodo imprimirPerimetro. Esta variable es local
a dicho mtodo y solo se la puede acceder dentro del mtodo. La diferencia fundamental entre una variable local
y un atributo de la clase es que al atributo se lo puede acceder desde cualquier mtodo de la clase y la variable
local solo existe mientras se est ejecutando el mtodo.

Problemas propuestos
1. Confeccionar una clase que represente un empleado. Definir como atributos su nombre y su sueldo.
Confeccionar los mtodos para la carga, otro para imprimir sus datos y por ltimo uno que imprima un
mensaje si debe pagar impuestos (si el sueldo supera a 3000)

2. Implementar la clase operaciones. Se deben cargar dos valores enteros, calcular su suma, resta,
multiplicacin y divisin, cada una en un mtodo, imprimir dichos resultados.
Solucin

Retornar

You might also like