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.
Actualmente existe un
estándar, denominado ISO C++, al que se han adherido la mayoría de los
fabricantes de compiladores más modernos. Existen también algunos intérpretes,
tales como ROOT.
Una particularidad del
C++ es la posibilidad de redefinir los operadores, y de poder crear nuevos
tipos que se comporten como tipos fundamentales.
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.
Tipos de datos:
C++ tiene los
siguientes tipos fundamentales:
Caracteres: char
(también es un entero), wchar_t
Enteros: short, int, long, long long
Números en coma
flotante: float, double, long double
Booleanos: bool
Vacío: void
El concepto de clase
Los objetos en C++ son
abstraídos mediante una clase. Según el paradigma de la programación orientada
a objetos un objeto consta de:
1. Identidad, que lo diferencia de otros
objetos (Nombre que llevara la clase a la que pertenece dicho objeto).
2.
Métodos o funciones miembro
3.
Atributos o variables miembro
Un ejemplo de clase que
podemos tomar es la clase perro. Cada perro comparte unas características
(atributos). Su número de patas, el color de su pelaje o su tamaño son algunos
de sus atributos. Las funciones que lo hagan ladrar, cambiar su comportamiento...
esas son las funciones de la clase.
Constructores
Son unos métodos
especiales que se ejecutan automáticamente al crear un objeto de la clase. En
su declaración no se especifica el tipo de dato que devuelven, y poseen el
mismo nombre que la clase a la que pertenecen. Al igual que otros métodos,
puede haber varios constructores sobrecargados, aunque no pueden existir
constructores virtuales.
Como característica
especial a la hora de implementar un constructor, justo después de la
declaración de los parámetros, se encuentra lo que se llama "lista de
inicializadores". Su objetivo es llamar a los constructores de los
atributos que conforman el objeto a construir.
Cabe destacar que no es
necesario declarar un constructor al igual que un destructor, pues el
compilador lo puede hacer, aunque no es la mejor forma de programar.
Destructores
Los destructores son
funciones miembro especiales llamadas automáticamente en la ejecución del
programa, y por tanto no tienen por qué ser llamadas explícitamente por el
programador. Sus principales cometidos son:
Liberar los recursos
computacionales que el objeto de dicha clase haya adquirido en tiempo de
ejecución al expirar éste.
Quitar los vínculos que
pudiesen tener otros recursos u objetos con éste.
Los destructores son
invocados automáticamente al alcanzar el flujo del programa el fin del ámbito
en el que está declarado el objeto. El único caso en el que se debe invocar
explícitamente al destructor de un objeto, es cuando éste fue creado mediante
el operador new, es decir, que éste vive en memoria heap, y no en la pila de
ejecución del programa. La invocación del destructor de un objeto que vive en
heap se realiza a través del operador delete para arrays.
Herencia
Existen varios tipos de
herencia entre clases en el lenguaje de programación C++. Estos son:
Herencia simple
La herencia en C++ es
un mecanismo de abstracción creado para poder facilitar y mejorar el diseño de
las clases de un programa. Con ella se pueden crear nuevas clases a partir de
clases ya hechas, siempre y cuando tengan un tipo de relación especial.
En la herencia, las
clases derivadas "heredan" los datos y las funciones miembro de las
clases base, pudiendo las clases derivadas redefinir estos comportamientos
(polimorfismo) y añadir comportamientos nuevos propios de las clases derivadas.
Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento
no es necesario para el uso de las clases), se proporciona un nuevo modo de
visibilidad de los datos/funciones: "protected". Cualquier cosa que
tenga visibilidad protected se comportará como pública en la clase Base y en
las que componen la jerarquía de herencia, y como privada en las clases que NO
sean de la jerarquía de la herencia.
Antes de utilizar la
herencia, nos tenemos que hacer una pregunta, y si tiene sentido, podemos
intentar usar esta jerarquía: Si la frase <claseB> ES-UN <claseA>
tiene sentido, entonces estamos ante un posible caso de herencia donde clase A
será la clase base y clase B la derivada.
Herencia múltiple
La herencia múltiple es
el mecanismo que permite al programador hacer clases derivadas a partir, no de
una sola clase base, sino de varias. Para entender esto mejor, pongamos un
ejemplo: Cuando ves a quien te atiende en una tienda, como persona que es,
podrás suponer que puede hablar, comer, andar, pero, por otro lado, como
empleado que es, también podrás suponer que tiene un jefe, que puede cobrarte dinero
por la compra, que puede devolverte el cambio, etc.
C++11
El 12 de agosto de
2011, Herb Sutter, presidente del comité de estándares de C++, informó la
aprobación unánime del nuevo estándar.2 La publicación del mismo se espera para
algún momento de 2011.
Entre las
características del nuevo estándar se pueden destacar:
Funciones lambda;
Referencias rvalue;
La palabra reservada
auto;
Inicialización
uniforme;
Plantillas con número
variable de argumentos.
Además se ha
actualizado la biblioteca estándar del lenguaje.
Diferencias de tipos
respecto a C
En C++, cualquier tipo
de datos que sea declarado completo (fully qualified, en inglés) se convierte
en un tipo de datos único. Las condiciones para que un tipo de datos T sea
declarado completo son a grandes rasgos las siguientes:
Es posible al momento
de compilación conocer el espacio asociado al tipo de datos (es decir, el
compilador debe conocer el resultado de sizeof(T)).
T Tiene al menos un
constructor, y un destructor, bien declarados.
Si T es un tipo
compuesto, o es una clase derivada, o es la especificación de una plantilla, o
cualquier combinación de las anteriores, entonces las dos condiciones
establecidas previamente deben aplicar para cada tipo de dato constituyente.
En general, esto
significa que cualquier tipo de datos definido haciendo uso de las cabeceras
completas, es un tipo de datos completo.
En particular, y, a
diferencia de lo que ocurría en C, los tipos definidos por medio de struct o
enum son tipos completos. Como tales, ahora son sujetos a sobrecarga,
conversiones implícitas, etcétera.
Los tipos enumerados,
entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de
datos únicos en C++. El tipo de datos bool, igualmente, pasa a ser un tipo de
datos único, mientras que en C funcionaba en algunos casos como un alias para
alguna clase de dato de tipo entero.
Compiladores
Uno de los compiladores
libres de C++ es el de GNU, el compilador G++ (parte del proyecto GCC, que
engloba varios compiladores para distintos lenguajes). Otros compiladores
comunes son Intel C++ Compiler, el compilador de Xcode, el compilador de
Borland C++, el compilador de CodeWarrior C++, el compilador g++ de Cygwin, el
compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre otros.
No hay comentarios:
Publicar un comentario