Hemos dicho que una clase está constituida por una serie de atributos (variables) y métodos (funciones). Los atributos deben ser privados y los métodos pueden ser públicos y privados según si se van a poder llamar desde fuera de la clase o no.
Otra característica de C++ con respecto a los métodos es que podemos definir varios con el mismo nombre.
Cuando definimos dos o más métodos con el mismo nombre decimos que los estamos sobrecargando.
La restricción para la sobrecarga de métodos es que los mismos deben diferir en cantidad o tipo de parámetros. Es decir podemos definir dos métodos con el mismo nombre pero uno tenga por ejemplo 3 parámetros y otro tenga 2 parámetros:
void mayor(int x1,int x2,int x3) void mayor(int x1,int x2)
O que tengan la misma cantidad de parámetros pero sean de distinto tipo:
void mayor(int x1,int x2) void mayor(char nombre1[40],char nombre2[40])
Plantear una clase llamada Matematica que implemente cuatro métodos llamados mayor. El primero que reciba como parámetros dos enteros y devuelva el mayor de ellos. El segundo que reciba tres enteros y devuelva el mayor. Los mismo deben hacer los siguientes dos métodos pero recibiendo parámetros de tipo float.
#include<iostream>
using namespace std;
class Matematica {
public:
int mayor(int x1,int x2);
int mayor(int x1,int x2,int x3);
float mayor(float x1,float x2);
float mayor(float x1,float x2,float x3);
};
int Matematica::mayor(int x1,int x2)
{
if (x1>x2)
return x1;
else
return x2;
}
int Matematica::mayor(int x1,int x2,int x3)
{
if (x1>x2 && x1>x3)
return x1;
else
if (x2>x3)
return x2;
else
return x3;
}
float Matematica::mayor(float x1,float x2)
{
if (x1>x2)
return x1;
else
return x2;
}
float Matematica::mayor(float x1,float x2,float x3)
{
if (x1>x2 && x1>x3)
return x1;
else
if (x2>x3)
return x2;
else
return x3;
}
int main()
{
Matematica m1;
cout<<"Mayor entre 6 y 8 : ";
cout<<m1.mayor(6,8);
cout <<"\n";
cout<<"Mayor entre 10, 40 y 5 : ";
cout<<m1.mayor(10,40,5);
cout <<"\n";
cout<<"Mayor entre 6.2 y 9.3 : ";
cout<<m1.mayor(6.2f,9.3f);
cout <<"\n";
cout<<"Mayor entre 7 , 12.5 y 4.2 : ";
cout<<m1.mayor(7.0f,12.5f,4.2f);
cout <<"\n";
return 0;
}
Este proyecto lo puede descargar en un zip desde este enlace : SobrecargaMetodos1.zip
Podemos observar que hemos definido cuatro métodos con el mismo nombre llamado mayor:
class Matematica {
public:
int mayor(int x1,int x2);
int mayor(int x1,int x2,int x3);
float mayor(float x1,float x2);
float mayor(float x1,float x2,float x3);
};
Dos de los mismos difieren en cantidad de parámetros (2 y 3) y cuando tienen la misma cantidad de parámetros difieren en el tipo de parámetros: int y float.
La sobrecarga de métodos nos facilita reducir la cantidad de nombres de métodos cuando realizan la misma actividad, si no existiera la sobrecarga estaríamos obligados a definir cuantro nombres de métodos distintos, por ejemplo:
class Matematica {
public:
int mayorDosEnteros(int x1,int x2);
int mayorTresEnteros(int x1,int x2,int x3);
float mayorDosReales(float x1,float x2);
float mayorTresReales(float x1,float x2,float x3);
};
Cuando se llama a un método sobrecargado el compilador sabe a cuál método llamar según la cantidad de parámetros que le pasamos:
cout<<m1.mayor(6,8);
cout<<m1.mayor(10,40,5);
y si hay dos métodos con la misma cantidad de parámetros analiza el tipo de datos que le pasamos:
cout<<m1.mayor(6,8);
cout<<m1.mayor(6.2f,9.3f);
Debemos agregar la letra f al final del valor real para indicar que se trata de un valor de tipo float.
Como sabemos el constructor es un método de la clase y como tal podemos sobrecargarlo, es decir definir más de un constructor.
Cuando definimos un objeto de la clase es cuando indicamos a qué constructor llamaremos según nuestras necesidades.
Crear una clase llamada EstructuraVector. Definir un atributo de tipo vector de 5 elementos enteros. Declarar dos constructores, uno sin parámetros que cargue el vector con valores cero y otro constructor que reciba un entero indicando el valor entero con el que deben inicializarse las componentes.
#include<iostream>
using namespace std;
class EstructuraVector {
int vec[5];
public:
EstructuraVector();
EstructuraVector(int valor);
void imprimir();
};
EstructuraVector::EstructuraVector()
{
for(int f=0;f<5;f++)
vec[f]=0;
}
EstructuraVector::EstructuraVector(int valor)
{
for(int f=0;f<5;f++)
vec[f]=valor;
}
void EstructuraVector::imprimir()
{
for(int f=0;f<5;f++)
{
cout <<vec[f];
cout <<"-";
}
cout<<"\n\n";
}
int main()
{
EstructuraVector v1;
v1.imprimir();
EstructuraVector v2(12);
v2.imprimir();
return 0;
}
Este proyecto lo puede descargar en un zip desde este enlace : SobrecargaMetodos2.zip
Podemos ver que hemos definido dos constructores que difieren en este caso en la cantidad de parámetros que tienen:
class EstructuraVector {
int vec[5];
public:
EstructuraVector();
EstructuraVector(int valor);
void imprimir();
};
Ahora cuando en la main definimos objetos de la clase EstructuraVector debemos elegir que constructor llamaremos:
EstructuraVector v1;
v1.imprimir();
EstructuraVector v2(12);
v2.imprimir();
Estamos llamando al constructor que no tiene parámetros cuando definimos el objeto v1 y estamos llamando al constructor que tiene un parámetro cuando definimos el objeto v2.
void imprimir(); //imprime todo el vector void imprimir(int hasta);//imprime desde el principio del vector hasta el valor que le pasamos void imprimir(int desde,int hasta);//imprime un rango de valores del vector.
#include <iostream>
using namespace std;
class Vector {
int vec[5];
public:
void cargar();
void imprimir();
void imprimir(int hasta);
void imprimir(int desde,int hasta);
};
void Vector::cargar()
{
for(int f=0;f<5;f++)
{
cout<<"Ingrese componente:";
cin>>vec[f];
}
}
void Vector::imprimir()
{
for(int f=0;f<5;f++)
{
cout<<vec[f]<<"-";
}
cout<<"\n\n";
}
void Vector::imprimir(int hasta)
{
for(int f=0;f<=hasta;f++)
{
cout<<vec[f]<<"-";
}
cout<<"\n\n";
}
void Vector::imprimir(int desde,int hasta)
{
for(int f=desde;f<=hasta;f++)
{
cout<<vec[f]<<"-";
}
cout<<"\n\n";
}
int main()
{
Vector v1;
v1.cargar();
v1.imprimir();
v1.imprimir(2);
v1.imprimir(2,4);
return 0;
}
Este proyecto lo puede descargar en un zip desde este enlace :SobrecargaMetodos3.zip
#include<iostream>
using namespace std;
class Punto {
int x,y;
public:
Punto();
Punto(int vx,int vy);
void imprimir();
};
Punto::Punto()
{
x=0;
y=0;
}
Punto::Punto(int vx,int vy)
{
x=vx;
y=vy;
}
void Punto::imprimir()
{
cout <<"x:"<<x<<" y:"<<y;
cout<<"\n\n";
}
int main()
{
Punto p1;
p1.imprimir();
Punto p2(30,2);
p2.imprimir();
return 0;
}
Este proyecto lo puede descargar en un zip desde este enlace :SobrecargaMetodos4.zip