C++, algo más que un paso adelante: Las clases
C++
es un lenguaje de programación basado en C. Sabiendo que
x++, significa en C (y C++) x=x+1, podemos entender la
intención de Stroustrup (el creador) de avanzar un paso
más, pero en mi modesta opinión, no es un paso es un
abismo.
Definición de nuevos tipos de datos
Todos
los lenguajes de programación, vienen con unos tipos
predefinidos (más o menos igual en todos ellos). En la
mayoría el usuario, puede crear nuevos datos combinación
de los predefinidos. Un "tipo de dato", no es solo una
combinación de datos, sino que además implica una serie
de operaciones, de funciones que las caracteriza. Por ejemplo, la suma
de 'a'(97) y 'b' (98) debiera dar 'ab', mientras que la suma como
enteros (97+98=195).
Por ejemplo, podemos definir un tipo de variable punto, que almacena dos enteros 'x' e 'y' y definimos la función asigna para dar valores, suma para sumar dos puntos e imprimir para mostrar por consola.
#include <iostream>
// la palabra struct crea un nuevo tipo de dato, en este caso denominado punto.
// que tiene dos variables enteras
struct punto{
int x;
int y;
};
// prototipo de las funciones utilizadas, observa los valores de retorno
punto asigna(int,int); // devuelve un punto
punto suma (punto,punto);// devuelve un punto
void imprimir(punto);// no devuelve ningun valor, solo realiza instrucciones.
int main()
{ punto A;// declaración de una variable punto definida por nosotros
punto B;
A=asigna(3,7);// llamada a la función asigna, que devuelve un punto
B=asigna(10,3);
imprimir(A);// llamada a la función imprimir
imprimir(B);
B=suma(A,B);// llamada a la función suma, que devuelve un punto
imprimir(B);
return 0;
}
punto asigna(int j, int i){
punto Z;
Z.x=j; // para acceder a un elemento de la estructura se utiliza el operador '.'
Z.y=i;
return Z;
}
void imprimir (punto Z){
std::cout<< "X= "<< Z.x <<" Y = "<< Z.y<<std::endl;
}
punto suma (punto Z, punto M){
punto R;
R.x=Z.x+M.x;
R.y=Z.y+M.y;
return R;
}
Hasta aquí todos los lenguajes (que conozco) pueden hacer algo similar.
Pero C++ tiene la posibilidad de definir nuevos tipos de datos: las clases.
Las
clases facilitan la creación de grandes proyectos (especialmente
entre varios autores). Las clases no solo establecen los datos de
nuestro "tipo de dato", sino que además incorporan las funciones
que permiten su uso. Normalmente, los datos son inaccesibles (privados)
y solo se manipulan a través de sus funciones (métodos).
Esto quiere decir que si elaboro un tipo de dato coherente, una clase
que funciona correctamente, podrán utilizarlos otros sin
problemas.
Las clases pueden heredarse, ¿quéeeee?,
esto es, que si tengo establecido un tipo de dato "alumno", y preciso
crear un tipo de dato "delegado" (que no es sino un tipo de alumno)
puedo desarrollar "delegado" a partir de "alumno", sin necesidad de
reescribir mucho código, tan solo aquel que implemente las
nuevas características.
Afortunadamente
para nosotros, utilizaremos abundantemente la herencia, y con escasas
líneas de código haremos aplicaciones gráficas,
aprovechando las clases de Gtkmm.
Además
Además
C++ incorpora la sobrecarga de funciones (polimorfismo). En muchos
lenguajes, esto no se permite, y si deseo realizar una función
que sume a un punto un número, o que sume dos puntos, preciso
implementar (dos)tres funciones distintas, con nombres diferentes:
sumapuntoint (punto,int);
sumaintpunto(int,punto);
sumapuntopunto(punto,punto);
Sin
embargo, en C++, podemos definir dos o más funciones con un
mismo nombre, a condición que los argumentos o el tipo devuelto,
difieran y el ordenador pueda determinar que función suma es
llamada durante el programa.
Y, por si fuera poco, permite la
sobrecarga de operadores, funciones especiales, que permiten al
programador un uso de los datos similar al de los datos predefinidos.
Veamos
un ejemplo de este último punto. El objeto no es aprender a
diseñar las clases, sino a ver parte del potencial de C++.
#include <iostream>
class punto{
int x;
int y;
public:
punto(int,int);
punto operator + (punto);
friend std::ostream& operator << (std::ostream&,punto);
};
// funcion main
int main()
{ punto A(7,7);
punto B(10,3);
std::cout<<"A es igual: "<<A<<std::endl;
std::cout<<"B es igual: "<<B<<std::endl;
B= A + B;
std::cout<<"Tras la suma:"<<std::endl<<std::endl;
std::cout<<"A es igual: "<<A<<std::endl;
std::cout<<"B es igual: "<<B<<std::endl;
return 0;
}
punto::punto(int j, int i){
x=j;
y=i;
}
punto punto::operator+ (punto P){
return punto(x+P.x,y+P.y);
}
std::ostream& operator << (std::ostream& os, punto P){
os<< "X= "<< P.x <<"; Y = "<< P.y<<";"<<std::endl;
return os;
}