Manual
logo



Programación C++ con AGU desde 0

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;
}