lunes, 15 de noviembre de 2010

LENGUAJES ORIENTADOS A OBJETOS - C++

Laboratorio de Lenguajes de Programación - Semana 9

"C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.

Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.

El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C."

FUENTE: http://es.wikipedia.org/wiki/C%2B%2B

C++ se considera un lenguaje híbrido porque ademas de incluir múltiples mecanismos para manejar objetos, se incluyen todas las funcionalidades de C, se puede decir que es un remix.

COMPILADOR

El S.O. de Ubuntu trae por defecto un compilador para C++ que forma parte del proyecto GCC, para llamarlo podemos ejecutar en la terminal la siguiente instrucción:

g++

Con ello llamaremos al compilador, que nos debe lanzar una ventana como esta:


La extension de los códigos fuente escritos en este lenguaje es *.cpp, los headers tienen la terminación *.hpp

VARIABLES

A grandes razgos podemos decir que los tipos de datos son los mismos que en el lenguaje C, sin embargo, un tipo de dato nuevo que llamo mi atencion es el llamado wchar_t, como sabemos la variable tipo char es de 1 byte, esto nos permitia manejar los 255 caractéres basicos del ASCII, pero en la actualidad ese estandar ASCII ha crecido con la inclusión de diferentes alfabetos de diferentes regiones; asi la variable wchar_t permite almacenar cualquier caracter que este por encima de los 255 del alfabeto ingles, por ejemplo símbolos griegos, cirílicos, chinos, etc.

Otra particularidad es el manejo de cadenas de caracteres, mientras en C teniamos que declarar un "arreglo" de caracteres, en C++ se utiliza la palabra string para declarar una cadena, claro que hay que incluir la libreria <string> por ejemplo:
C : char cadena[4] = "HOLA"

C++ : string cadena = "Esto es una cadena"



BÁSICO

La libreria estándar se C++ se llama iostream, tiene la misma funcionalidad que la libreria stdio.h, leer una sequencia de caractéres, números, o instrucciones desde el teclado, y tambien imprimir en pantalla los mensajes y resultados de los procesos ejecutados por nuestro programa. Tambien debemos agregar la línea using namespace std;

Salida Estándar

Para imprimir en la pantalla algun dato o mensaje desde nuestra aplicación usaremos cout; el cual obedece la siguiente sintaxis:
cout << "Cadena de salida"; // Imprime una cadena en pantalla
cout << 120;                // Imprime un numero
cout << x;                  // Imprime el contenido de la variable x
cout << "Hola, tengo " << x << " años y me llamo " << nombre; // Combinacion variables y texto

Al igual que en C, para saltar de línea se puede usar \n, pero tambien podemos indicarle que una línea ha terminado con endl, por ejemplo:
cout << "Primera linea." << endl;
cout << "Segunda linea." << endl; 

Que produciria la salida:
Primera linea.
Segunda linea

Entrada Estándar

Para ingresar datos se utiliza cin; de la siguiente manera:
int a, b, c, d;
string cadena;

cout << "Ingresa un valor -> ";
cin >> a;

cout << "Ingresa tres valores mas -> ";
cin >> b >> c >> d;

cout << "Ingresa una palabra -> ";
cin >> cadena;

La última sentencia es valida si deseamos introducir una palabra, si deseamos introducir una cadena de caractéres completa, se combinara cin con la instruccion getline:
string cadena;

cout << "Ingresa una cadena -> ";
getline(cin , cadena);

ESTRUCTURAS DE CONTROL

Existen diferentes estructuras de control que nos ayudaran a controlar nuestro programa dadas diferentes circunstancias especiales:

Estructura condicional

if (condicion) {proceso1; proceso2; ... ; proceson; }
if (x == 100)
 cout << "x es igual a 100";
.
"DOS POSIBILIDADES (Si no es uno es lo otro)"

if (condicion) proceso1; else proceso2
if (x == 100)
 cout << "x es igual a 100";
else
 cout << "x no es igual a 100";

"MULTIPLES POSIBILADES (Si no es esto entonces es esto, si no esto otro"

if (condicion) proceso1; else if (condicion2) proceso2; else proceso3;
if (x > 0)
 cout << "x es positiva";
else if (x < 0)
 cout << "x es negativa";
else
 cout << "x es 0";

Estructuras de Iteracion

Ciclo while

while (expresion) proceso;
int x = 10;
cout << "Comenzando conteo Houston . . ."
while (x>0) {
   cout << x << endl;
   --x;
}
cout << "FUEGO!!!";

Ciclo do-while

do proceso while (expresion);
int x;
do {
  cout << "Ingresa un numero (0 para salir);
  cin >> x;
  cout << "Igresaste el numero " x;
} while (x != 0);

Ciclo for

for (inicializacion; condicion; incremento) procesos;
int x;
cout << "Inicia el conteo Houston . . .";
for(x = 10; x > 0; x--)
   cout << x << "-";
cout << "FUEGO!!!";

Estructura Selectiva

switch (expresion) {
case constante1:
grupo de procesos 1;
break;
case constant2:
grupo de procesos 2;
break;
.
.
.
default:
grupo de procesos por default (cuando no se cumple ninguno de los anteriores);
}
switch (x) {
 case 1:
   cout << "x es 1";
   break;
 case 2:
   cout << "x es 2";
   break;
 default:
   cout << "el valor de x se desconoce";
 }

C++: Programación Orientada a Objetos


Clases y Objetos


Una clase es un concepto ampliado de una estructura de datos, pero en lugar de mantener sólo los datos, que puede contener tanto datos como funciones.

Un objeto es una creación de instancias de una clase.

En términos de coloquiales de variables, una clase sería el tipo y un objeto sería la variable.

Las clases se declaran con la palabra reservada class, y su estructura sería como la siguiente:
class nombre_clase {
 especificador_de_acceso1:
   miembro1;
 especificador_de_acceso2:
   miembro2;
 ...
 } nombre_del_objeto;

Los especificadores de acceso pueden ser de tres tipos:

private (miembros privados) Miembros de una clase que sólo son accesibles desde el interior de los demás miembros de la misma clase o de sus amigos.
protected (miembros protegidos) Miembros que son accesibles desde los miembros de su misma clase y de sus amigos, y también de los miembros de sus clases derivadas.
public (miembros publicos) Son accesibles desde cualquier lugar donde el objeto es visible.

Por ejemplo:
class CRectangle {
   int x, y;
 public:
   void set_values (int,int);
   int area () {return (x*y);}
}rect;

Mi clase se llama CRectangle, y el objeto completo se llama rect, aunque no los hayamos especificado como tales tenemos dos miembros privados x y y (ya que el nivel de acceso por default es private, después tenemos otros dos miembros públicos: void valores (int,int); y int area (void);. "set_values" será considerado como un emulador de un constructor, porque inicializara los valores de "x" y "y", mientras que "area" calculara el área del rectángulo.

Pequeño Ejemplo
#include <iostream>
using namespace std;

class CRectangle {
   int x, y;
 public:
   void set_values (int,int);
   int area () {return (x*y);}
};

void CRectangle::set_values (int a, int b) {
 x = a;
 y = b;
}

int main () {
 CRectangle rect;
 rect.set_values (3,4);
 cout << "area: " << rect.area();
 return 0;
}

Comenzando en la función main: Primero creamos un objeto de la clase CRectangle llamado "rect". Llamamos a lo que denominamos "constructor" enviandole los 2 parámetros que son los lados del rectángulo, estos valores se envían a la función "void CRectange::set_values (int a, int b)" el cual asignará los 2 valores enviados a los miembros privados "x" y "y". Después imprimimos el valor del área calculada llamando a "rect.area", el cual esta preparado para regresarnos el producto de los dos lados.

EJECUCIÓN

Constructores y Destructores


Todos los objetos necesitan inicializar las variables al momento de ser llamados y volverse operativos. En el ejemplo anterior nosotros necesitamos asignar un valor a las variables "x" y "y" si realmente queremos que se nos regrese algún resultado al momento de ejecutar nuestro programa, es por ello que necesitamos lo que denomina Constructor.

Los constructores tienen el mismo nombre que la clase madre y son llamados automaticamente cuando un objeto de su misma clase es creado. Estos constructores no regresan ningun valor, ni siquiera void.

Un destructor cumple la función opuesta, son llamados cuando un objeto es destruido porque su tiempo de existencia ha terminado ya sea porque el objeto de definió localmente en una función y el proceso de la función terminó o porque se trataba de un objeto asignado dinamicamente y la memoria ocupada se libera con "delete". Los destructores se declaran como miembros de la clase y se deben llamar igual, pero van precedidos por un tilde (~), al igual que los constructores no regresan nada al terminar su ejecucion.

Si nosotros quisieramos implementar un constructor y un destructor en el ejemplo anterior basta con reemplazar la funcion "void set_values"; asi el nuevo miembro público se llamaría CRectangle (int,int), que sería el constructor. Y la función quedaría de esta forma:
CRectangle::CRectangle (int a, int b) {
 x = a;
 y = b;
}

Y nuestro destructor se llamaría ~CRectangle ();, y tendriamos que darle algunos procesos:
CRectangle::~CRectangle () {
 delete width;
 delete height;
}

Su tarea sera la de liberar la memoria ocupada por las variables "width" y "height".

EJEMPLO UTILIZANDO CONSTRUCTOR Y DESTRUCTOR
#include <iostream>
using namespace std;

class CRectangle {
   int *width, *height;
 public:
   CRectangle (int,int);
   ~CRectangle ();
   int area () {return (*width * *height);}
};

CRectangle::CRectangle (int a, int b) {
 width = new int;
 height = new int;
 *width = a;
 *height = b;
}

CRectangle::~CRectangle () {
 delete width;
 delete height;
}

int main () {
 CRectangle rect (3,4), rectb (5,6);
 cout << "rect area: " << rect.area() << endl;
 cout << "rectb area: " << rectb.area() << endl;
 return 0;
}


EJECUCIÓN


Ahora implementamos 2 instancias diferentes de la misma clase y los mismos miembros.

Estos son algunos aspectos basicos del lenguaje C++, claro que faltan otros mas por analizar. Si les interesa seguir aprendiendo pueden ver el tutorial que les deje en mis Recursos, donde podrán aprender otros conceptos relacionados a la programación orientada a objetos.

SALUDOS!!! ^_^

3 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Muy completa la entrada. Ocho puntos para el lab.

    ResponderEliminar
  3. Muchas gracias por la información, eso de los contructores y los destructores se que será de gran ayuda.
    Me recuerda lo que hizo la Doctora en clase con los contructores en el Buscaminas.

    ResponderEliminar