Que es C++

C++

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

 

Posteriormente se añadieron facilidades de programación genérica, que se sumaron a los paradigmas de programación estructurada y 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.

 

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

Características de C++

 

    Su sintaxis es heredada del lenguaje C.

    Programa orientado a objetos (POO).

    Permite la agrupación de instrucciones.

    Lenguaje muy didáctico, con este lenguaje puedes aprender muchos otros lenguajes con gran facilidad.

    Es portátil y tiene un gran número de compiladores en diferentes plataformas y sistemas operativos.

    Permite la separación de un programa en módulos que admiten compilación independiente.

    Es un lenguaje de alto nivel.

Ejemplos

 

A continuación se cita un programa de ejemplo Hola mundo escrito en C++:

 

/* Esta cabecera permite usar los objetos que encapsulan los descriptores stdout

y stdin: cout(<<) y cin(>>)*/

#include <iostream>

 

using namespace std;

 

int main()

{

    cout << "Hola mundo" << endl;

    return 0;

}

 

Al usar la directiva #include se le dice al compilador que busque e interprete todos los elementos definidos en el archivo que acompaña la directiva (en este caso, iostream). Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre, se crearon los espacios de nombres o namespace del singular en inglés. En este caso hay un espacio de nombres llamado std, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estándar de C++. Al incluir la sentencia using namespace std le estamos diciendo al compilador que usaremos el espacio de nombres std por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres, como pueden ser los objetos cout y cin, que representan el flujo de salida estándar (típicamente la pantalla o una ventana de texto) y el flujo de entrada estándar (típicamente el teclado).

 

La definición de funciones es igual que en C, salvo por la característica de que si main no va a recoger argumentos, no tenemos por qué ponérselos, a diferencia de C, donde había que ponerlos explícitamente, aunque no se fueran a usar. Queda solo comentar que el símbolo << se conoce como operador de inserción, y grosso modo está enviando a cout lo que queremos mostrar por pantalla para que lo pinte, en este caso la cadena "Hola mundo". El mismo operador << se puede usar varias veces en la misma sentencia, de forma que gracias a esta característica podremos concatenar el objeto endl al final, cuyo resultado será imprimir un retorno de línea.

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 modificador unsigned se puede aplicar a enteros para obtener números sin signo (por omisión los enteros contienen signo), con lo que se consigue un rango mayor de números naturales.

Tamaños asociados

 

Según la máquina y el compilador que se utilice los tipos primitivos pueden ocupar un determinado tamaño en memoria. La siguiente lista ilustra el número de bits que ocupan los distintos tipos primitivos en la arquitectura x86.

Tamaños de tipos primitivos bajo i386 (GCC) Tipo        Número de bits

char        8

short       16

int    32

float        32

double     64

 

Otras arquitecturas pueden requerir distintos tamaños de tipos de datos primitivos. C++ no dice nada acerca de cuál es el número de bits en un byte, ni del tamaño de estos tipos; más bien, ofrece solamente las siguientes "garantías de tipos":

 

    De acuerdo al estándar C99, un tipo char debe ocupar exactamente un byte compuesto de un mínimo de 8 bits independientemente de la arquitectura de la máquina.

    El tamaño reconocido de char es de 1. Es decir, sizeof(char) siempre devuelve 1.

    Un tipo short tiene al menos el mismo tamaño que un tipo char.

    Un tipo long tiene al menos el doble tamaño en bytes que un tipo short.

    Un tipo int tiene un tamaño entre el de short y el de long, ambos inclusive, preferentemente el tamaño de un apuntador de memoria de la máquina. Su valor máximo es 2147483647, usando 32 bits.

    Un tipo unsigned tiene el mismo tamaño que su versión signed.

Principios

 

Todo programa en C++ debe tener la función principal main() (a no ser que se especifique en tiempo de compilación otro punto de entrada, que en realidad es la función que tiene el main())

 

int main()

{}

 

La función principal del código fuente main debe tener uno de los siguientes prototipos:

int main()

int main(int argc, char** argv)

 

Aunque no es estándar algunas implementaciones permiten

int main(int argc, char** argv, char** env)

 

La primera es la forma por omisión de un programa que no recibe parámetros ni argumentos. La segunda forma tiene dos parámetros: argc, un número que describe el número de argumentos del programa (incluyendo el nombre del programa mismo), y argv, un puntero a un array de punteros, de argc elementos, donde el elemento argv[i] representa el i-ésimo argumento entregado al programa. En el tercer caso se añade la posibilidad de poder acceder a las variables de entorno de ejecución de la misma forma que se accede a los argumentos del programa, pero reflejados sobre la variable env.

 

El tipo de retorno de main es un valor entero int. Al finalizar la función main, debe incluirse el valor de retorno (por ejemplo, return 0;, aunque el estándar prevé solamente dos posibles valores de retorno: EXIT_SUCCESS y EXIT_FAILURE, definidas en el archivo cstdlib), o salir por medio de la función exit. Alternativamente puede dejarse en blanco, en cuyo caso el compilador es responsable de agregar la salida adecuada.

Destructores

Véase también: Destructor (informática)

 

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 este.

    Quitar los vínculos que pudiesen tener otros recursos u objetos con este.

 

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 este fue creado mediante el operador new, es decir, que este 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 o delete[] para arrays. Ejemplo:

 

int main() {

  int *unEntero = new int(12);         //asignamos un entero en memoria heap con el valor 12

  int *arrayDeEnteros = new int[25]; //asignamos memoria para 25 enteros(no están inicializados)

  delete unEntero;                     //liberamos la memoria que ocupaba unEntero

  delete[] arrayDeEnteros;           //liberamos la memoria ocupada por arrayDeEnteros

  return 0;

}

 

Si no se utilizara el operador delete y delete[] en ese caso, la memoria ocupada por unEntero y arrayDeEnteros respectivamente, quedaría ocupada sin sentido. Cuando una porción de memoria queda ocupada por una variable que ya no se utiliza, y no hay forma de acceder a ella, se denomina un 'memory leak'. En aplicaciones grandes, si ocurren muchos memory leaks, el programa puede terminar ocupando bastante más memoria RAM de la que debería, lo que no es para nada conveniente. Es por esto, que el manejo de memoria heap debe usarse conscientemente.

 

Existen dos tipos de destructores pueden ser públicos o privados, según si se declaran:

 

    Si es público se llama desde cualquier parte del programa para destruir el objeto.

    Si es privado no se permite la destrucción del objeto por el usuario.

 

El uso de destructores es clave en el concepto de Adquirir Recursos es Inicializar.

Biblioteca de entrada y salida

 

Las clases basic_ostream y basic_stream, y los objetos cout y cin, 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 objeto de ser útiles en la inserción/extracción de datos a dichos flujos. Son operadores inteligentes, ya que son capaces de adaptarse al tipo de datos que reciben, 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)

{

  return fs << punto.x << "," << punto.y;

}

 

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.

Algoritmos

 

Combinando la utilización de templates y un estilo específico para denotar tipos y variables, la STL ofrece una serie de funciones que representan operaciones comunes, y cuyo objetivo es "parametrizar" las operaciones en que estas funciones se ven involucradas de modo que su lectura, comprensión y mantenimiento, sean más fáciles de realizar.

 

Un ejemplo es la función copy, la cual simplemente copia variables desde un lugar a otro. Más estrictamente, copia los contenidos cuyas ubicaciones están delimitadas por dos iteradores, al espacio indicado por un tercer iterador. La sintaxis es:

 

copy (inicio_origen, fin_origen, inicio_destino);

 

De este modo, todos los datos que están entre inicio_origen y fin_origen, excluyendo el dato ubicado en este último, son copiados a un lugar descrito o apuntado por inicio_destino.









Comentarios

Entradas populares de este blog

Ventajas Y Desventajas en C++