C más más
Keywords: C más más, 1983, Array, Bjarne Stroustrup, C, Compiladores, DJGPP
- El título de éste artículo es incorrecto debido a limitaciones técnicas. El título correcto sería C++.
C++ (pronunciado /ce.mas.más/, /si.plos.plós/ o /si.plas.plás/) es un lenguaje de programación, diseñado a mediados de los ochenta, por Bjarne Stroustrup, como extensión del lenguaje de programación C.
Es un lenguaje híbrido, que se puede compilar y resulta más sencillo de aprender para los programadores que ya conocen C. 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 como ROOT (enlace externo). Las principales características del C++ son abstracción (encapsulación), el soporte para programación orientada a objetos (polimorfismo) y el soporte de plantillas o programación genérica (Templates). Por ende, se puede decir que C++ es un lenguaje que abarca tres paradigmas de la programación: La programación estructurada, la programación genérica y la programación orientada a objetos. Las plantillas se las define de la manera siguiente: template <parámetros> declaración X y se las instancia con X<parámetros>.
Pero añade otra serie de propiedades que se encuentran más difícilmente en otros lenguajes de alto nivel:
- Posibilidad de redefinir los operadores
- Identificación de tipos en tiempo de ejecución (RTTI)
C++ está considerado por muchos como el lenguaje más potente debido a que permite trabajar tanto a alto como a bajo nivel, sin embargo es a su vez uno de los que menos automatismos trae (obliga a hacerlo casi todo manualmente al igual que C) lo que dificulta mucho su aprendizaje.
El nombre C++ fue propuesto por Rick Masciatti 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++, "C++" significa "uno más de C" y se refiere a que C++ es una extensión de C.
Algunos dicen que "C++" todavía significa "C", porque "++" en este caso es el operador de la postincrementación, es decir, aumenta el valor de la expresión a la que se refiere, después, en las instrucciones siguientes. Por esto el valor de la expresión en este momento permanece original.
| Tabla de contenidos |
Un ejemplo
Aquí hay un programa de ejemplo escrito en C++:
#include <iostream>
int main()
{
std::cout << "¡Hola mundo!" << std::endl;
return 0;
}
Aqui se definiran algunos conceptos generales de la programación orientada a objetos.
- clase: Es una plantilla de la cual se pueden sacar varios objetos, contienen prototipos de atributos y métodos que puede heredar cada una de sus instancias.
- Objeto: Es un modulo el cual debe tener un nombre diferente de otros objetos, contiene estado y comportamiento.
- Identidad: Permite al objeto diferenciarse de los demás
Tipos Primitivos en C++
En C y en C++ exiten dos clases de tipos primitivos: enteros y flotantes los cuales pueden ser clasificados de la siguiente manera:
- Enteros
- int
- long int
- short
- char
- Flotantes
- float
- double
El modificador unsigned se puede aplicar a enteros para obtener numeros sin signo, por defecto los enteros contienen signo. Segun la máquina y el compilador que se utilize los tipos primitivos pueden ocupar un determinado tamaño en memoria. La siguiente lista ilustra el número de bits que ocupan los distintos tipo primitivos en una PC de familia 386 con gcc
| Tipo | Número de Bits |
| char | 8 |
| short | 16 |
| int | 32 |
| float | 32 |
| double | 64 |
Principios
Todo programa en C++ debe tener la función main() :
int main()
{
return 0;
}
El Concepto de Clase
Los objetos en C++ son abstraidos mediante una Clase, según el paradigma de la programación orientada a objetos un objeto consta de:
- Métodos o funciones
- Variables Miembro
Un ejemplo de una clase
class Punto
{
// Variable miembro privada
int id;
protected:
// Variables miembro protegidas
int x;
int y;
public:
// Constructor
Punto();
// Destructor
~Punto();
// Funciones miembro o metodos
int ObtenerX();
int ObtenerY();
};
Constructores
Son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase. En la declaración de estos, no se especifica el tipo de devolución, y tienen el mismo nombre que la clase. 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 la "lista de inicializadores": Su objetivo es el de llamar a los constructores de los atributos que conforman el objeto a construir.
Tomando el ejemplo de la Clase Punto, si deseamos que cada vez que se cree un objeto de esta clase las coordenadas del punto sean igual a cero podemos agregar un construtor como se muestra a continuacion:
// Clase Punto
//-----------------------------------------------------------------------
class Punto
{
public:
// Constructor
Punto()
{
// Inicializar la variables miembro
x = 0;
y = 0;
}
// Coordenadas del punto
float x;
float y;
};
//-----------------------------------------------------------------------
// Main para demostrar el funcionamiento de la clase
#include <iostream>
using namespace std;
int main()
{
Punto MiPunto;
cout<<"Coordenada X:"<<MiPunto.x<<endl;
cout<<"Coordenada Y:"<<MiPunto.y<<endl;
return 0;
}
Si compilamos y ejecutamos el anterior programa,la salida que debemos obtener debe ser similar a la siguiente: \\ Coordenada X:0 \\ Coordenada Y:0 \\
Destructores
Los destructores son funciones miembro especiales llamadas automáticamente, y que por tanto no deben ser llamadas explicitamente por el programador. Su cometido es el de liberar los recursos computacionales que el objeto de la clase haya adquirido en tiempo de ejecución cuando el tiempo de vida de este haya expirado. Los destructores al alcanzar el fin del ámbito en el que está declarado el objeto.
Funciones Miembro
Función miembro es aquella que está declarada en ámbito de clase. Son similares a las funciones de siempre, con la salvedad de que el compilador realizará el denominado Name Mangling: Cambiará el nombre de la función añadiéndole a este un identificador de la clase en la que está declarada. Además, las funciones miembro reciben implícitamente un parámetro más: El puntero this, que referencia al objeto que ejecuta la función.
Plantillas
Las plantillas son el mecanismo de C++ para implantar el paradigma de la Programación genérica. Con las plantillas, se permite que una clase o función trabaje con tipos de datos abstractos, especificándose más adelante cuales son los que se quieren usar. Por ejemplo, es posible construir un vector genérico que pueda contener cualquier tipo de estructura de datos. Así, se pueden declarar objetos de la clase de este vector que contengan enteror, flotantes, polígonos, figuras, fichas de personal, etc. Se antepone template <typename A[=tipo_por_defecto],B[=tipo_por_defecto],...> a la estructura de programación (clase, función, etc.).
Espacios de Nombres
Excepciones
Herencia
- Herencia Simple
- Herencia Multiple
Sobrecarga de Operadores
Es posible definir el comportamiento de un operador del lenguaje para que trabaje con tipos de datos definidos por el usuario. Estos comportamientos se implementa de la misma manera que una función, salvo que esta tendrá un nombre especial: Tipoo de dato de devolución operator<token del operador> (parámetros)
- Operador +
- Operador ++
- Operador -
- Operador --
- Operador *
- Operador /
- Operador %
- Operador new
- Operador delete
- Operador ()
- Operador []
Biblioteca Estándar de Plantillas (STL)
Mala idea sería que un lenguaje de programación no tuviera una serie de bibliotecas integradas para la manipulación más básica de datos. En C++, aparte de poder usar las bibliotecas de C, se puede usar la nativa STL (Standard Template Library), propia del lenguaje. Proporciona una serie de clases parametrizadas (véase más arriba plantillas) que permite almacenado de datos, procesado y entrada/salida. Más que biblioteca, STL es un conjunto de ellas. De esta forma solo se incluirá en el fichero ejecutable final solo aquellas que sean necesarias para la aplicación que se esté programando, reduciendo drásticamente el uso innecesario de memoria que necesite.
ostreams / istreams
Caben destacar las clases basic_ostream y basic_stream, y los objetos cout y cin, pertenecientes a estas clases, respectivamente. Proporcionan la entrada y salida estándar de datos (teclado/pantalla). También está disponible cerr, similar a cout, usado para la salida estándar de errores. Estas clases tienen sobrecargados los operadores << y >>, respectivamente, con el objetivo de servir para la inserción/extracción de datos a estos flujos. Son operadores inteligentes: Serán capaces de adaptarse al tipo de datos que reciban, aunque tendremos que definir el comportamiento de dicha entrada/salida para clases/tipos de datos definidos por el usuario. Por ejemplo:
ostream& operator<<(ostream& fs,const Punto& punto)
{
fs << punto.x << "," << punto.y;
return fs;
}
De esta forma, para mostrar un punto, solo habría que realizar la siguiente expresión:
//... Punto p(4,5); //... cout "Las coordenadas son: "<< p << endl; //...
Es posible formatear la entrada/salida, indicando el número de dígitos decimales a mostrar, si los textos se pasarán a minúsculas o mayúsculas, si los números recibidos están en formato octal o hexadecimal, etc.
fstreams
Tipo de flujo para el manejo de ficheros. Todo lo anteriormente dicho es aplicable a este apartado. Hay tres clases (ficheros de lectura, de escritura o de lectura/escritura): ifstream,ofstream y fstream.
Pueden abrirse pasando al constructor los parámetros relativos a la ubicación del fichero y del modo de aperura:
| ios::ate al abrir el fichero, se posicionará al final | ios::trunc Al abrir, se borra el contenido | ios::app Modo "append": Se abrirá el fichero en modo de anexado | ios::binary Apertura de un fichero binario (esto es un concepto relativo al sistema operativo en cuestión, luego en muchas ocasiones, no es necesario) |
Para cerrar un fichero, puede usarse el método close, o esperar a que el destructor de las clases lo cierren automáticamente.
sstreams
Se destacan dos clases, ostringstream e istringstream. Todo lo anteriormente dicho es aplicable a estas clases. Trataran a una cadena como si de un flujo de datos se tratase. ostringstream permite elaborar una cadena de texto insertando datos cual flujo, e istringstream podrá extraer la información contenida en una cadena (pasada como parámetro en su constructor) con el operador >>. Ejemplos:
ostringstream s; s << nombre << "," << edad << "," << estatura << "," << punto(5,6) << endl; cout << s.str();
istringstream s(cadena); s >> nombre >> edad >> estatura >> p;
contenedores
Son clases plantillas especiales para almacenar tipos de datos genéricos, sean cuales sean. Según la naturaleza del almacenado, disponemos de varios tipos:
- Vectores: Se definen por
vector<tipo_de_dato> nombre_del_vector;
Equivalen a los array de cualquier lenguaje, con diversas salvedades. Tienen tamaño dinámico, con lo que se puede insertar elementos aún si el vector está lleno. A diferencia de los vectores clásicos a bajo nivel de C, también pueden lanzar excepciones si se accede a un elemento cuyo rango está fuera del vector en cuestión, usando, en vez del operador [], el método at(). - Colas dobles: Ya escribiré en otro momento.
- Listas: Ya escribiré en otro momento.
- Adaptadores de secuencia: Ya escribiré en otro momento.
- Contenedores asociativos: map y multimap: Ya escibiré en otro momento.
- Contenedores asociativos: set y multiset: Ya escribiré en otro momento.
Métodos comunes y no comunes entre los contenedores de la STL: Ya lo escribiré en otro momento.
iteradores
Pueden considerarse como una generalización de la clase de "puntero". Un iterador es un tipo de dato que permite el recorrido y la búsqueda de elementos en los contenedores. blablabla... ya seguiré escribiendo.
Compiladores
Uno de los mejores compiladores de C++ es el de GNU, el compilador [[G++]] (parte del proyecto Gcc, que engloba varios compiladores para distintos lenguajes), descargable desde la dirección http://www.gnu.org.
Actualmente los compiladores más comunes que pueden encontrarse para C++ en el sistema operativo Windows son [[Visual C++]] y MinGW. Visual C++ pertenece a Microsoft y es de pago, mientras que MinGW es una versión del compilador de GNU adaptada para este sistema operativo .[[Dev-C++]] es un IDE de libre distribuición para este compilador y puede ser descargado de su web oficial Bloodshed gratuitamente. También existe DJGPP, aunque actualmente está en desuso.
Enlaces relacionados
La web de "C con Clase": [Español]
- REDIRECT Plantilla:Lenguajes de programación
</nowiki>
