C++

C++
Información sobre la plantilla
Parte de la familia Derivados de C
C++.jpg
Lenguaje de programación
CreadorBjarne Stroustrup
Lanzamiento inicial1983
Sistemas Operativos compatiblesMultiplataforma


C++ es un lenguaje imperativo orientado a objetos derivado del C. En realidad un superconjunto de C, que nació para añadirle cualidades y características de las que carecía. El resultado es que como su ancestro, sigue muy ligado al hardware subyacente, manteniendo una considerable potencia para programación a bajo nivel, pero se la han añadido elementos que le permiten también un estilo de programación con alto nivel de abstracción. Estrictamente hablando, C no es un subconjunto de C++; de hecho es posible escribir código C que es ilegal en C++. Pero a efectos prácticos, dado el esfuerzo de compatibilidad desplegado en su diseño, puede considerarse que C++ es una extensión del C clásico. La definición "oficial" del lenguaje nos dice que C++ es un lenguaje de propósito general basado en el C, al que se han añadido nuevos tipos de datos, clases, plantillas, mecanismo de excepciones, sistema de espacios de nombres, funciones inline, sobrecarga de operadores, referencias, operadores para manejo de memoria persistente, y algunas utilidades adicionales de librería (en realidad la librería Estándar C es un subconjunto de la librería C++)

Un Poco de historia

El comité para el estándar ANSI C fue formado en 1983 con el objetivo de crear un lenguaje uniforme a partir del C original, desarrollado por Kernighan y Ritchie en 1972, en la ATT. Hasta entonces el estándar lo marcaba el libro escrito en 1978 por estos dos autores1. El lenguaje C++ se comenzó a desarrollar en 1980. Su autor fue Bjarne Stroustrup, también de la ATT. Al comienzo era una extensión del lenguaje C que fue denominada C with classes. Este nuevo lenguaje comenzó a ser utilizado fuera de la ATT en 1983. El nombre C++ es también de ese año, y hace referencia al carácter del operador incremento de C (++). Ante la gran difusión y éxito que iba obteniendo en el mundo de los programadores, la ATT comenzó a estandarizarlo internamente en 1987. En 1989 se formó un comité ANSI (seguido algún tiempo después por un comité ISO) para estandarizarlo a nivel americano e internacional. En la actualidad, el C++ es un lenguaje versátil, potente y general. Su éxito entre los programadores profesionales le ha llevado a ocupar el primer puesto como herramienta de desarrollo de aplicaciones. El C++ mantiene las ventajas del C en cuanto a riqueza de operadores y expresiones, flexibilidad, concisión y eficiencia. Además, ha eliminado algunas de las dificultades y limitaciones del C original. La evolución de C++ ha continuado con la aparición de Java, un lenguaje creado simplificando algunas cosas de C++ y añadiendo otras, que se utiliza para realizar aplicaciones en Internet. Hay que señalar que el C++ ha influido en algunos puntos muy importantes del ANSI C, como por ejemplo en la forma de declarar las funciones, en los punteros a void, etc. En efecto, aunque el C++ es posterior al C, sus primeras versiones son anteriores al ANSI C, y algunas de las mejoras de éste fueron tomadas del C++. C++ es a la vez un lenguaje procedural (orientado a algoritmos) y orientado a objetos. Como lenguaje procedural se asemeja al C y es compatible con él, aunque ya se ha dicho que presenta ciertas ventajas. Como lenguaje orientado a objetos se basa en una filosofía completamente diferente, que exige del programador un completo cambio de mentalidad. Las características propias de la Programación Orientada a Objetos (Object Oriented Programming, u OOP) de C++ son modificaciones mayores que sí que cambian radicalmente su naturaleza.

Conceptos generales de la programación orientada a objetos

  • Clase: Es una plantilla que define la estructura de un conjunto de objetos, que al ser creados se llamarán las instancias de la clase. Esta estructura está compuesta por la definición de los atributos y la implementación de las operaciones ( métodos ).
  • Objeto: Es la implementación de una instancia de clase, es decir, una ocurrencia de esta, que tiene los atributos definidos por la clase, y sobre la que se puede ejecutar las operaciones definidas en ella.
  • Identidad: Característica de cada objeto que lo diferencia de los demás, incluyendo de aquellos que pudieran pertenecer a la misma clase y tener los mismos valores en sus atributos.
  • Herencia: Es la capacidad que tienen las clases para heredar propiedades y métodos de otras clases.

Acerca de la POO

La POO es una nueva filosofía de programación que se basa en la utilización de objetos. El objetivo de la POO no es sino la meta de cualquier modelo de programación estructurada convencional: "imponer" una serie de normas de desarrollo que aseguren y faciliten la mantenibilidad y reusabilidad del código. Los mecanismos básicos de la POO son: objetos, mensajes, métodos y clases.

  • Objetos. Un objeto es una entidad que tiene unos atributos particulares (datos) y unas formas de operar sobre ellos (los métodos o funciones miembro). Es decir, un objeto incluye, por una parte una serie de operaciones que definen su comportamiento, y una serie de variables manipuladas por esas funciones que definen su estado. Por ejemplo, una ventana Windows contendrá operaciones como "maximizar" y variables como "ancho" y "alto" de la ventana.
  • Mensajes. En C++, un mensaje se corresponde con el nombre de uno de los métodos de un objeto. Cuando se pasa un mensaje a un objeto, este responde ejecutando el código de la función asociada.
  • Método. Un método (función miembro) se implementa dentro de un objeto y determina como tiene que actuar el objeto cuando se produce el mensaje asociado. En C++ un método se corresponde con la definición de la función miembro del objeto. La estructura más interna de un objeto está oculta, de tal manera que la única conexión con el exterior son los mensajes
  • Clases. Una clase es la definición de un tipo de objetos. De esta manera, una clase "Empleado" representaría todos los empleados de una empresa, mientras que un objeto de esa clase (también denominado instancia) representaría a uno de esos empleados en particular.

Las principales características de la POO son: abstracción, encapsulamiento, herencia y polimorfismo:

  • Abstracción. Es el mecanismo de diseño en la POO. Nos permite extraer de un conjunto de entidades datos y comportamientos comunes para almacenarlos en clases.
  • Encapsulamiento. Mediante esta técnica conseguiremos que cada clase sea una caja negra, de tal manera que los objetos de esa clase se puedan manipular como unidades básicas. Los detalles de la implementación se encuentran dentro de la clase, mientras que desde el exterior, un objeto será simplemente una entidad que responde a una serie de mensajes públicos (también denominados interfaz de la clase).
  • Herencia. Es el mecanismo que nos permite crear clases derivadas (especialización) a partir de clases bases (generalización). Es decir, podríamos tener la clase "Empleado" (clase base) y la clase "Vendedor" derivando de la anterior. Una librería de clases (como la MFC) no es más que un conjunto de definiciones de clases interconectadas por múltiples relaciones de herencia.
  • Polimorfismo. Esta característica nos permite disponer de múltiples implementaciones de un mismo método de clase, dependiendo de la clase en la que se realice. Es decir, podemos acceder a una variedad de métodos distintos (con el mismo nombre) mediante el mismo mecanismo de acceso. En C++ el polimorfismo se consigue mediante la definición de clases derivadas, funciones virtuales y el uso de punteros a objetos.

Otros dos conceptos muy importantes en la POO son relativos a la creación y destrucción de objetos. En lenguajes estructurados convencionales, cuando se define una variable se le reserva espacio en memoria y, si no se inicializa expresamente, se hace por defecto (por ejemplo, en C una variable global siempre se inicializa a 0, pero una automática no, por lo que si no se inicializa expresamente su contenido inicial será basura); por otra parte, cuando se destruye una variable (por que se abandona el ámbito de su definición - scope -) se libera la memoria que estaba ocupando. Si ahora hacemos el paralelismo obligado entre variables y objetos para los lenguajes POO nos daremos cuenta de que deben existir procedimientos especiales de construcción y destrucción de objetos. En concreto, cada clase tiene dos funciones miembro especiales denominadas constructor y destructor.

  • Constructor -> Función miembro que es automáticamente invocada cada vez que se define un objeto, su objetivo es la inicialización del mismo. Toma el mismo nombre que la clase, puede recibir parámetros y podemos tener varios constructores definidos.
  • Destructor -> Función miembro invocada automáticamente cada vez que se destruye un objeto. Su objetivo es realizar operaciones como liberación de memoria, cerrar ficheros abiertos, etc. Toma el mismo nombre de la clase comenzado primero por el carácter "~", no toma parámetros y no admite la sobrecarga (sólo puede existir uno en cada clase).

En muchos casos, para las clases mas sencillas, podemos encontrar clases que no tiene constructor o destructor, ó ninguno de los dos. En C++, siempre existen constructores y destructores por defecto que realizan una inicialización/liberación estándar.

Acerca de Intérprete y compiladores

Antes, mencionar que tanto C como C++ son lenguajes compilados, y no interpretados. Esta diferencia es muy importante, ya que afecta mucho a muchos aspectos relacionados con la ejecución del programa. En un lenguaje interpretado, el programa está escrito en forma de texto, es el propio programa fuente. Este programa fuente es procesado por un programa externo, el intérprete, que traduce el programa, instrucción a instrucción, al tiempo que lo ejecuta. En los lenguajes interpretados no existen programas ejecutables directamente por el ordenador. El intérprete traduce, en tiempo real, cada línea del programa fuente, cada vez que se quiere ejecutar el programa. El los lenguajes compilados el proceso de traducción sólo se hace una vez. El programa compilador toma como entrada el código fuente del programa, y da como salida un fichero que puede ser ejecutado por el ordenador directamente. Una vez compilado, el programa ejecutable es autónomo, y ya no es necesario disponer del programa original ni del compilador para ejecutarlo. Cada opción tiene sus ventajas e inconvenientes, y algunas características que son consideradas una ventaja, pueden ser un inconveniente en ciertas circunstancias, y viceversa.

  • Los lenguajes interpretados son fácilmente modificables, ya que necesitamos tener el el código fuente disponible en el ordenador. En los compilados, estos ficheros no son necesarios, una vez compilados.
  • Los lenguajes interpretados necesitan un programa externo, llamado intérprete o a veces máquina virtual, o framework. Este programa actua como intermediario entre el fuente y el sistema operativo. En los compilados ese papel lo desempeña el compilador, pero al contrario que con el intérprete, una vez ha hecho su trabajo, no es necesario que esté presente para ejecutar el programa.
  • Estas dos características, lógicamente, hacen que los programas compilados requieran menos espacio de memoria que los interpretados (si contamos el espacio usado por el intérprete), y en general, los compilados son más rápidos, ya que sólo se compilan una vez, y el tiempo dedicado a esa tarea no se suma al de ejecución.

Entre los lenguajes interpretados están: BASIC (Código de instrucciones de propósito general para principiantes), Java, PHP. Muchos lenguajes de script, etc. Entre los lenguajes compilados están: C, C++, Pascal.

Qué se puede hacer con C++

¿Qué clase de programas y aplicaciones se pueden crear usando C y C++? La respuesta es muy sencilla: TODOS. Tanto C como C++ son lenguajes de programación de propósito general. Todo puede programarse con ellos, desde sistemas operativos y compiladores hasta aplicaciones de bases de datos y procesadores de texto, pasando por juegos, aplicaciones a medida, etc.

Un ejemplo de código

Este es el clásico programa hola mundo, la idea está centrada en el nacimiento de un nuevo programa de manos de su creador.

#include <iostream>

using namespace std;

int main()
{
   cout << "Hola mundo" << endl;
   return 0;
}

¿Qué se ha hecho en C o en C++?

Sistemas Operativos y otros programas

  • Así como Unix el antecesor de este sistema operativo, GNU/Linux -a menudo denominado tan sólo como Linux, que es el nombre del núcleo del SO- hace uso de un buen número de lenguajes de programación en sus distintos componentes. ¿Cuáles son esos lenguajes? Cada tipo de recurso parece tener ciertas preferencias, y es que hay lenguajes más adecuados para unas cosas. Obviamente el lenguaje de programación C sigue siendo la base, pero hay mucho más implicados.
  • Kernel y drivers de dispositivos: Tanto los drivers como el kernel funcionan en un nivel realmente bajo de operaciones en el ordenador. Para escribir el kernel del sistema operativo y acceder a las propiedades del hardware tales como los ciclos de la memoria, buses de entrada/salida, etc., se necesita un lenguaje que pueda comunicarse con el hardware con potencia. El kernel Linux hace uso del lenguaje C (aunque en realidad no se trate de un lenguaje de bajo nivel) con una pequeña parte en lenguaje ensamblador.
  • Librerías y utilidades: Las librerías y utilidades básicas del sistema tales como mkdir, chmod, chown, head, tail, chroot, uptime, users también están escritas en lenguaje C.
  • Gestores de paquetes y programas de configuración: Los gestores de paquetes tales como yum, apt, dpkg, etcétera, también están escritos en C, que como veis es la estrella absoluta de los componentes "base" de un sistema GNU/Linux.
  • Entornos de Escritorio y gestores de ventanas: La mayoría de gente usa un entorno de escritorio, y es que a día de hoy poco queda sólo en interfaz de línea de comandos. Los gestores de ventanas tales como metacity, kwin están desarrollados en C y requieren gcc para ser compilados. El entorno de escritorio, iconos, ventanas, barras de herramientas, etc, están basados en librerías específicas (Qt para KDE, GTK+ para GNOME) y hacen uso del lenguaje mayoritario, C.
  • Aplicaciones gráficas de usuario: Este es el punto donde entran en juego una gran cantidad de lenguajes de programación, dado que básicamente es la capa más alta. Tenemos una gran variedad: C, Python, Java, Perl y otros. Hay librerías GTK+, Tcl/Tk, Qt que son un frontend gráfico a tareas que corren por detrás en línea de comando.
  • El Sistema operativo Windows está hecho básicamente en C, C tiene la ventaja de que puede escalarse con ensamblador, lo cual es buena opción para optimizar ciertos módulos.

Las versiones anteriores de Windows estaban hechas en Basic (Basic NO visual Basic) que es un lenguaje de bajo nivel de hace unos cuantos años ya. Es un lenguaje que se usa mucho en la electrónica aun.

  • Actualmente Windows 7 Mac os x Leopard y Linux usan mas de una Tecnología ya se empezó a usar c# c++ y hasta java en el caso de linux se usa phytom c y tbn ensambladores y demás cosas, y Mac siempre basado en Unix con compilación en C++ para los últimos Sistemas Operativos.

Ver también

Fuentes