Índice General
Enviado por ednygilmore • 21 de Noviembre de 2014 • 3.496 Palabras (14 Páginas) • 193 Visitas
Índice General
• Índice General
• Copyright
• Introducción
• Reseña histórica
• Herramientas
• Estructuras de datos vs. clases
• Arrays en C vs. arrays dinámicos
• La nueva entrada/salida de C++
• Pequeñas mejoras del C++ frente al C
• Argumentos por defecto.
• Sobrecarga de operadores
• Referencias vs. punteros.
• Conclusiones
• Sobre este documento...
Copyright
(C) Ignacio Martín Bragado, Mundo Linux.
Este artículo ha sido publicado en el nº 33 de Mundo Linux, una publicación de Revistas Profesionales http://www.revistasprofesionales.com
Introducción
Desde que en la década de los 70 Ritchie y Kernighan crearon el lenguaje C hasta hoy ha pasado ya el tiempo suficiente para poder afirmar que el lenguaje C ha marcado un hito en la historia de la computación. El C ha sido, probablemente el lenguaje más usado en creación de software, y sistemas operativos enteros como Linux están escritos, salvo minúsculas partes de código, en él.
No obstante desde su nacimiento (que la historia cifra en una variante de un lenguaje anterior llamado B, construido en parte como lenguaje en el que programar UNIX) hasta ahora, el C ha ido sufriendo una evolución, para ir adaptando y solucionando problemas que el C presentaba a los programadores, hasta dar lugar al estándar C ANSI (1990) y un segundo estándar en 1.999.
Una evolución mucho más drástica del C ha dado lugar al C++. Este lenguaje supone más la creación de un nuevo lenguaje que una mejora de C, si bien se tomó C como base por ser un lenguaje de nivel relativamente bajo, versátil, muy extendido y portable.
Reseña histórica
El C++ ha sufrido también un largo proceso desde que fue inventado en AT&T por Bjarne Stroustrup. Empezó en 1980 como un primitivo "C con clases" hasta que en 1987 se hizo evidente la necesidad de un proceso de estandarización, proyecto en el que los laboratorios Bell de AT&T, contribuyeron activamente compartiendo el borrador del manual de referencia de C++. Dicho manual fue el documento base para su posterior estandarización ANSI, que tuvo lugar entre los años 1989-1991. Este proceso finalizó por fin en Julio de 1.998 (¡hace sólo tres años!). El documento final se puede consultar en http://web.ansi.org/public/search.asp. Una copia, quizás no muy reciente, está presente en http://www.csci.csusb.edu/dick/c++std/cd2/index.html.
Herramientas
La cuestión es: ¿Por qué desarrollar un nuevo lenguaje de programación cuando el C cuenta ya con toda una historia de éxitos a sus espaldas? ¿Por qué aprenderlo?. La respuesta es que el C presenta una serie de inconvenientes y dificultades que el C++ trata de paliar. Precisamente de cómo paliar dichas dificultades es de lo que va a tratar esta serie de artículos. Para seguir estos artículos basta con tener una distribución de Linux que incluya un gcc relativamente reciente (versión 2.95 o superior) y conocer ya el lenguaje C. Este requisito no es necesario para estudiar C++ pero si lo será aquí puesto que pretendemos establecer una comparación con él y avanzar relativamente deprisa en el C++.
Estructuras de datos vs. clases
Dado cualquier problema de programación relativamente complejo en C suele ser necesario crear una estructura de datos que pueda manejar hábilmente el problema. Posteriormente se crean una serie de funciones que puedan operar y manipular dichas estructuras de datos.
Por ejemplo, si en un programa necesitamos operar con rectángulos distintos y calcular su área, podemos poner:
struct RECTANGULO
{
double LadoX;
double LadoY;
};
y crear una función:
double Area(struct RECTANGULO *rect)
{
return rect->LadoX * rect->LadoY;
}
En C++ se puede asociar directamente una función a una estructura, de tal forma que quede patente que dicha función opera exclusivamente con la estructura, es decir, definir la estructura como:
struct RECTANGULO
{
double LadoX;
double LadoY;
double Area();
};
e incluir la función Area() con el operador de resolución de ámbito "::"
double RECTANGULO::Area()
{
return LadoX * LadoY;
}
y poner así el código como:
int main()
{
RECTANGULO rect;
rect.LadoX = 4.3;
rect.LadoY = 3.2;
printf("El área es %f\n",rect.Area());
}
¿Qué ventajas supone esto frente a la codificación de C?
• El programa queda más claro e inteligible. El código queda agrupado en cuanto a un objeto (un rectángulo) y no esparcido en datos y funciones.
• Podemos proteger los datos que queramos de la estructura usando las palabras claves public, que permiten el acceso total a los datos, private, que sólo deja acceder a los datos a las funciones de la propia estructura, y protected, cuyo uso se verá en siguientes artículos.
• Podemos usar constructores y destructores que serán invocados cuando se construya el objeto y cuando se salga de ámbito.
• Podemos tratar objetos propios creados por nosotros con la misma facilidad que tipos de datos propios del compilador como int, char, ...
De esta forma surge la noción de objeto o clase: una agrupación de datos y funciones encapsuladas y consistentes en las que su acceso está limitado.
Antes de ver un ejemplo más completo donde poder exponer todo lo anterior es aconsejable plantearse otro problema.
Arrays en C vs. arrays dinámicos
Cuando en C queremos tener una colección de elementos podemos crear un array:
int cadena[80];
y tener así una colección de 80 enteros. No obstante en muchas ocasiones no conocemos el tamaño exacto de la colección en tiempo de compilación, sino cuando se ejecuta el programa. Para esto podemos asignar dinámicamente memoria con malloc y poner:
unsigned int elementos = 80;
int *coleccion;
coleccion = (int *)malloc(elementos*sizeof(int));
Esto soluciona parcialmente el problema a costa de crear nuevos problemas potenciales:
1. Tenemos ahora un puntero char que puede ser sobreescrito (si copiamos más de 80 caracteres, en esta caso concreto).
2. Hemos necesitado hacer un "type cast" del puntero void * que devuelve malloc a int *. Aunque en este caso no se ve claro por qué esto puede ser un problema, hay que decir que los punteros void, si bien son muy útiles en ciertas ocasiones, son también muy peligrosos porque carecen de toda información
...