abril 2017
Las constantes son expresiones con un valor fijo.

Literales

Los Literales son el tipo más obvio de constantes. Expresan valores particulares dentro del código fuente de un programa. Ya hemos utilizado algunos literales en capítulos anteriores para dar valores específicos a variables o para expresar mensajes que queríamos imprimir en pantalla, como por ejemplo, cuando escribimos:
a = 5;
El 5 en este pedazo de código era una constante literal.
Las constantes literales se pueden clasificar en:
  • enteros integers, 
  • punto flotante, 
  • caracteres char
  • cadenas strings
  • booleanos bool
  • punteros y 
  • literales definidas por el usuario.

Números Enteros Integer: 

1776
707
-273
Estas son constantes numéricas que identifican valores enteros integer. Tenga en cuenta que no se encierran entre comilllas o cualquier otro tipo carácter especial; ya que son una simple sucesión de cifras que representan un número entero en la base decimal; por ejemplo: 1776 representa siempre el valor mil setecientos setenta y séis.
Tambien tenemos los números decimales y C++ permite el uso de números octales (osea de base 8) y números hexadecimales (base 16) como constantes literales. Para literales octales, los dígitos están precedidos de un carácter 0 (cero). Y para hexadecimal, están precedidos por los caracteres 0x (cero, x). Por ejemplo, las siguientes contantes literales son todas equivalentes entre sí:
75
0113
0x4b
Todos ellos representan el mismo número que es: 75 (setenta y cinco) expresado como un numeral de base 10, numeral octal (0113) y numeral hexadecimal (0x4b), respectivamente.
Estas constantes literales tienen un tipo, al igual que las variables.
Por defecto, literales enteros son de tipo int. Sin embargo, ciertos sufijos pueden añadirse a un literal entero, para especificar un tipo de entero diferente:
Sufijo Tipo de Modificador
u ó U
unsigned
l ó L
long
ll ó LL
long long
Unsigned se puede combinar con cualquiera de los otros dos en cualquier orden para formar unsigned long ó unsigned long long.
Por ejemplo:
75    //int
75u //unsigned int
75l //long
75ul //unsigned long
75lu //unsigned long
En todos los casos encima, el sufijo puede ser especificado usando letras mayúsculas ó minúsculas.

Numeros de Punto Flotante

Expresan valores reales, con decimales y/o exponentes. Pueden incluir o un punto decimal ó un carácter e (que expresa "por diez elevado a la X", donde X es un valor entero que sigue al carácter e) ó un punto decimal y un carácter e, veamos todo esto en ejemplos:
3.14159    // 3.14159
6.02e23 // 6.02 x 10^23
1.6e-19 // 1.6 x 10^-19
3.0 // 3.0
Estos son cuatro números válidos con decimales, expresados en el lenguaje C++.
  • El primer numero es PI,
  • El segundo es el número de Avogadro,
  • El tercero es la carga eléctrica de un electrón (un número extremadamente pequeño) y
  • El cuarto es el número 3 expresado como literal numérico con punto flotante.
El tipo predetermiando para literales de punto flotante es double. Los literales de tipo flotante de tipo float ó long double se pueden especificar agregando uno de los siguientes sufijos:
Sufijo Tipo
f ó F
float
l ó L
long double

Por ejemplo:
3.14159L    // long double
6.02e23f // float
Cualquiera de las letras que pueden formar parte de una constante numérica de punto flotante (e, f ó l) pueden ser escritas utilizando letras mayúsculas o minúsculas sin diferencia de significado.

Literales de caracteres y strings 

Los literales de caracteres y strings son colocados entre aspas ( ' ' ), veamos:
'z'
'p'
"Hello World"
"How do you do?"
Las dos primeras expresiones representan literales de un sólo carácter y las dos siguientes representan literales de strings compuestas de varios carácteres.
Observe que para representar un sólo carácter lo hemos incluído entre comillas simples ('z' ó 'p') y para expresar una string (que generalmente consta de más de un carácter), la incluimos con caracteres entre comillas dobles ( "Hello World" ó "How do you do?" ).
Los literales de un sólo carácter y de string requieren comillas que los rodeen para distinguirlos de posibles identificadores de variables o palabras claves reservadas. Observe la diferencia entre estas dos expresiones:
x
'x'
Aquí x sin aspas se refiere a un identificador, como el nombre de una variable o un tipo compuesto, mientras que 'x' (entre aspas simples) se referiría al carácter literal 'x' (o carácter que representa una letra minúscula x).
Caracteres y literales de strings tambien pueden representar caracteres especiales que son difíciles o imposibles de expresar de otra manera en el código fuente del programa, como por ejemplo nueva línea (\n) ó tab (\t). Estos caracteres especiales están todos precedidos por un carácter de barra invertida (\).
Aquí tiene usted una lista de códigos de escape de un sólo carácter:
Código de Escape Descripción
\n
Nueva línea
\r
retornar
\t
Tabulación
\v
Tab Vertical
\b
backspace
\f
Feed de formulário (feed de página)
\a
alert (beep)
\'
Comilla simple single quote
\"
Comilla Doble double quote
\?
Simbolo de interrogación
\\
back slash
Por ejemplo:
'\n'
'\t'
"izquierda \t Derecha"
"uno\ndos\ntres"
Internamente, las computadoras representan a estos personajes como códigos numéricos: los ordenadores normalmente usan una extensión del sistema de codificación de caracteres ASCII (para ver más informaciones entre aquí). Los caracteres tambien se pueden representar en literales usando su código numérico escribiendo un carácter de barra invertida (\) seguido por el código expresado como un número octal (base-8) ó hexadecimal (base 16). 
  • Para un valor octal, la barra invertida es seguida directamente por los dígitos; 
  • mientras que para un valor hexadecimal, un carácter x se inserta entre la barra diagonal invertida y los dígitos hexadecimales a continuación (por ejemplo: \x20 ó \ x4A).
Varios literales de string pueden ser concatenados para formar una cadena literal, esto se realiza simplemente separándolos por uno o más espacios en blanco, incluyendo pestañas tabs (\t), líneas nuevas newlines (\n) y otros caracteres en blanco válidos. Por ejemplo:
"esto forma" "una sola"     " cadena " 
"de caracteres"
Lo anterior es una cadena literal equivalente a:
"esto formauna sola cadena de caracteres"
Observe como los espacios dentro de las aspas son parte del literal mientras que los que estan fuera no lo son.
x = "string expresado en \
dos lineas"

es equivalente a:

x = "string expresado en dos lineas"
Todos los literales de caracteres y literales de strings descritos anteriormente están formados por caracteres de tipo char. Se puede especificar un tipo de carácter diferente utilizando uno de los siguientes prefijos:
Prefijo Tipo de Carácter
u
char16_t
U
char32_t
L
wchar_t
Tenga en cuenta que, a diferencia de los sufijos de tipo para literales enteros, estos prefijos son sensibles a mayúsculas y minúsculas:
  • minúsculas para char16_t y
  • mayúsculas para char32_t y wchar_t
Para literales de cadenas, aparte de lo anterior u, U y L, existen dos prefijos adicionales:

Prefijo Descripción
u8
El literal de string se codifica en el ejecutable usando UTF-8
R
El literal de string es un string sin formato
En cadenas sin formato, las barras invertidas backslashes y las comillas simples y dobles son carácteres válidos; el contenido del literal está delimitado por un inicial R "secuencia (y un final) secuencia", donde secuencia es cualquier secuencia de caracteres(incluyendo una scuencia vacía).
El contenido de la cadena es lo que está dentro del paréntesis, ignorando la secuencia de delimitación en sí. Por ejemplo:
R"(string con \backslash) "
R"&%$(string con \backslash)&%$"
Ambas cadenas anteriores son equivalentes a "string con \\backslash". El prefijo R se puede combinar con cualquier otro prefijo, como u, L ó u8.

Otros Literales

Existen 3 literales de palabras claves en C++, 
  • true,
  • false y
  • nullptr
true y false son los dos valores posibles para variables de tipo bool.
nullptr es el valor del puntero nulo.

bool foo = true;
bool bar = false;
int* p = nullptr;

Tipos de Expresiones Constantes

A veces, es conveniente dar un nombre a un valor constante:
const double pi = 3.1415926;
const char tab = '\t';
A continuación, podemos utilizar estos nombres en lugar de los literales que se definieron, veamos esto en un ejemplo práctico:
//constantes
#include <iostream>
using namespace std;
//declarando constantes
const double pi = 3.14159;
const char nuevalinea = '\n';

int main()
{
//declarando variables
double r = 5.0; //radio
double circulo;

circulo = 2 * pi * r;
cout << circulo;
cout << nuevalinea;
}

Definiciones de PreProcesador (#define)

Otro mecanismo para nombrar valores constantes es el uso de definiciones de preprocesador. Estos tienen el siguiente formato:
#define identifier replacement
Después de esta directiva #define, cualquier ocurrencia de identificador en el código se interpreta como reemplazo replacement, donde "replacement" es cualquier secuencia de caracteres (hasta el final de la línea).
Este reemplazo es realizado por el preprocesador y sucede antes de que el programa sea compilado, provocando así una especie de reemplazo ciego: la validez de los tipos o sintaxis involucradas, no serán comprobadas de ninguna manera.
Por ejemplo:
//constantes
#include <iostream>
using namespace std;
//declarando constantes
#define PI 3.14159
#define NUEVALINEA '\n'
int main()
{
//declarando variables
double r = 5.0; //radio
double circulo;

circulo = 2 * pi * r;
cout << circulo;
cout << nuevalinea;
}


Note usted que las lineas #define son directivas de pre-procesador y como tales son instrucciones de una sola línea - como las declaraciones C++ - no requieren punto y coma (;) al final, la directiva se extiende automáticamente hasta el final de la línea!, interezante no?
Culminado y entendido este paso, habremos llegado a una parte importante más de conocimientos para empezar a trabajar con C++, no podemos desistir si queremos llegar a desenvolver cualquier cosa con este maravilloso lenguaje!, más adelante veremos lo que son los Operadores en este lenguaje con lo cual iremos practicando con varios programas más complejos. No deje de practicar, eso es vital!
La utilidad de los programas "HelloWorld" mostrados en el artículo anterior de este Tutorial, es bastante cuestionable. Sí, realmente esto es así porque tuvimos que escribir varias líneas de código, para luego compilarlas y en seguida ejecutar el programa resultante, tan sólo para obtener una simple frase escrita en pantalla.
Muchas personas estarán de acuerdo con que habría sido mucho más fácil escribir la frase de salida nosotros mismos no?.
Sin embargo, la programación es mucho más que imprimir textos simples en pantalla señores.
Para ir un poco más allá y ser capaces de escribir programas que realicen tareas útiles y que realmente nos ahorren trabajo, necesitamos pues introducir el concepto de variables a nuestro estudio!.
Se lo explico de la siguiente manera: para comenzar, imaginemos que le pido que guarde en su mente el número 5 y luego pido que también memorice el número 2 al mismo tiempo. Usted acaba de almacenar 2 valores diferentes en su memória (el 5 y el 2), no es muy difícil. Ahora, si le pido que  añada 1 al primer número que le dije, debería entonces, estar conservando los números 6(5+1) y el número 2 en su memória; ya la cosa cambia y usted comienza a trabajar como lo haría un programa en C++.
Entonces podríamos, por ejemplo, restar los dos valores y obtener 4 como resultado.
a = 5;
b = 2;
a = a + 1;
resultado = a - b;
Es obvio que este ejemplo es muy simple, ya que hemos utilizado tan sólo 2 pequeños valores enteros integer, pero considere que su computadora puede almacenar millones de números como estos al mismo tiempo y llevar a cabo sofisticadas operaciones matemáticas con ellos.
¿Entendió esto?,
Pues entonces ahora podremos definir a una variable como una porción de memória para almacenar un valor, perfecto?.
Cada variable necesita un nombre que la identifique y la distinga entre las demás. Por ejemplo, en el código anterior los nombres de ellas eran a, b y resultado; pero podríamos haberlas llamado de cualquier otra forma; siempre y cuando consigan ser identificadores C++ válidos. ¿Qué son identificadores C++ válidos?

Identificadores C++ válidos

Un identificador C++ válido es una secuencia de una o más letras, dígitos o carácteres de subrayados (_). Los espacios, los signos de puntuación y los símbolos no pueden formar parte de un identificador. Además, los identificadores siempre comenzarán con una letra o con un carácter de subrayado(_).
Pero en la mayoría de los casos estos identificadores se consideran reservados para palabras claves específicas del compilador o identificadores externos, así como identificadores que contienen dos carácteres de subrayado sucesivos en cualquier lugar. En ningún caso pueden comenzar con un dígito.
C++ utiliza una serie de palabras claves para identificar operaciones y descripciones de datos; por lo tanto, los identificadores creados por un programador no pueden coincidir con estas palabras clave, que no se le olvide.
Las palabras clave estándar reservadas que no se pueden utilizar como identificadores creados por el programador son:

*alignas *alignof *and *and_eq  *asm *auto *bitand *bitor *bool *break 
*case *catch *char *char 16_t *char 32_t *class *compl *const *constexpr
*const_cast *continue *decltype *default *delete *do *double *long *mutable
*namespace *new *noexcept *not *not_eq *null_ptr *operator *or *or_eq
*private *protected *public *register *reinterpret_cast *return *short
*signed *sizeof *static *static_assert *static_cast *struct *switch *this
*template *thread_local *throw *true *try *typedef *typeid *typename *union
*unsigned *using *virtual *void *volatile *wchar_t *while *xor *xor_eq

Los compiladores específicos también pueden tener palabras clave específicas adicionales.
Muy Importante: El lenguaje C++ es un lenguaje "sensible a mayúsculas y minúsculas". Esto significa que un identificador escrito en mayúsculas no es equivalente a otro con el mismo nombre, escrito en minúsculas. Así por ejemplo, la variable RESULT no es lo mismo que la variable Result o la variable result; estos son 3 identificadores diferentes que identifican 3 variables diferentes.  

Tipos de Datos Fundamentales

Los valores de las variables se almacenan en algún lugar y en una ubicación que no es especificada, dentro de la memória del ordenador, todas ellas siendo ceros y unos.
Nuestro programa no necesita saber la ubicación exacta donde se almacena una variable, este simplemente puede referirse a ella por su nombre y usarla como quiera.
Lo que el programa necesita realmente saber es el tipo de datos almacenados en la variable. No es lo mismo almacenar un entero simple que almacenar una letra o un número de punto flotante grande; a pesar de que todos están representados con ceros y unos, no se interpretan de la misma manera y en muchos casos, no ocupan la misma cantidad de memória.
Los tipos de datos fundamentales: son tipos básicos implementados directamente por el lenguaje,  los cuales representan unidades de almacenamiento básicas soportadas nativamente por la mayoría de los sistemas.
Pueden clasificarse principalmente en:
  • Primer Tipo: Caracteres: representan un solo carácter, como 'A' o '$'. El tipo más basico es char, que es un carácter de un byte. Otros tipos también se proporcionan para caracteres más amplios.
  • Segundo Tipo: Enteros numéricos: Pueden almacenar un valor de número entero, como por ejemplo: 7 ó 1024. Estos existen en una variedad de tamaños y pueden ser asignados(con signo - o +) o no asignados(sin formato, osea sin - ó +), dependiendo si soportan valores negativos o no.
  • Tercer Tipo: De punto Flotante: Pueden representar valores reales, como 3.14 ó 0.01; con diferentes niveles de precisión, dependiendo claro de cuál de los 3 tipos de punto flotante se utilize; que pueden ser: Float, Double ó Long Double.
  • Cuarto Tipo: Booleano: conocido en C++ como bool, sólo puede representar uno de los 2 estados: True ("verdadero") y False ("Falso").
Aquí les dejo una tabla que muestra los tipos fundamentales en C++:
Grupo Nombres de Tipos Notas sobre Tamaño/Precisión
Carácteres
char Exactamente un byte en tamaño. Por lo menos 8 bits.
char16_t No puede ser más pequeño que char. Al menos 16 bits.
char32_t No es más pequeño que char16_t. Al menos 32 bits.
wchart_t Puede representar el mayor conjunto de caracteres admitidos en C++.
Tipo Enteros (signed)
signed char El mismo tamaño que char. Al menos 8 bits. .
signed short int No es más pequeño que char. Al menos 16 bits.
signed int No más pequeño que short. Al menos 16 bits.
signed long int No es menor que int. Al menos 32 bits.
signed long long int No más pequeño que long. Al menos 64 bits.
Tipo Enteros (unsigned)
unsigned char (El mismo tamaño que sus homólogos signed)
unsigned short int
unsigned int
unsigned long int
unsigned long long int
Tipo de Puntos Flotantes
float
double Precisión no inferior al float
long double Precisión no inferior al double
Tipo Boolean
bool
Tipo Void
void Sin Almacenamiento
Puntero Nulo
decltype(nullptr)
Al analizar la tabla anterior debemos anotar que los nombres de ciertos tipos de enteros integer, pueden ser abreviados sin sus componentes asignados signed e int; osea sólo la parte que NO está con letra cursiva es necesaria para identificar el tipo, la parte que esta con letra cursiva es opcional.
Por ejemplo, signed short int puede ser abreviado como signed short, short int ó simplemente short; todos identifican el mismo tipo fundamental.
Dentro de cada uno de los grupos anteriores, la diferencia entre tipos es sólo su tamaño (es decir, cuanto ocupan de memória):
  • el primer tipo en cada grupo es el que menos memoria ocupa, osea es el más pequeño; 
  • mientras que el último de cada tipo corresponde al más grande por lo tanto el que ocupa más memoria. Siendo cada tipo mayor que el que lo precede en el mismo grupo.
  • Además de eso tenemos que tener en cuenta que los tipos en un mismo grupo tienen las mismas propiedades.
Observe en la tabla anterior que aparte de char (el cual tiene establecido un tamaño de un byte), ninguno de los tipos fundamentales tiene un tamaño estándar especificado (más un tamaño mínimo a lo mucho); entonces afirmamos que el tipo a veces no es requerido exactamente de este tamaño mínimo.
Esto de ninguna manera significa que estos tipos son de un tamaño indeterminado, lo que pasa es que no hay un tamaño estándar en todos los compiladores y máquinas; cada implementación del compilador puede especificar los tamaños de estos tipos, los cuales se ajustan mejor a la arquitectura en la que se va a ejecutar el programa en desenvolvimiento.
Esta especificacion de tamaño bastante genérica para los tipos es que le da al lenguaje C++ mucha más flexibilidad para adaptarse a un trabajo extraordinario en todo tipo de plataformas, hasta en las más actuales.
Los tamaños de tipo anteriores se expresan en bits; cuanto más bits tenga un tipo, más valores distintos puede representar; pero al mismo tiempo, también consumirá más espacio en memória:
Tamaño Valores Representables Únicos Observaciones
8-bit
256 = 28
16-bit
65 536 = 216
32-bit
4 294 967 296 = 232 (~4 billones)
64-bit
18 446 744 073 709 551 616 = 264 (~18 billones de billones)
Los tipos enteros integer al tener valores representables altos: significa que el rango de valores que estos pueden representar es mayor. Vamos a entender mejor esto, por ejemplo: un 16-bit unsigned integer podría representar 65 536 valores distintos en el rango de 0 a 65 535, mientras que su contrario osea el "no asignado" "unsigned" sería capaz de representar, en la mayoría de los casos, la mitad de estos valores ósea entre -32 768 y 32 767. Tenga en cuenta que el rango de valores positivos reduce aproximadamente a la mitad en tipos asignados signed en comparación con tipos no asignados unsigned, todo esto debido a que uno de los 16 bits se utiliza para el signo + ó - positivo ó negativo; esta es una diferencia relativamente modesta en el rango y rara vez se justifica el uso de tipos sin asignar unsigned basados puramente en el rango de valores positivos que puedan representar.
Para los tipos de puntos flotantes, el tamaño afecta su precisión, por tener más o menos bits para su valor significativo y exponente.
Las propiedades de los tipos fundamentales en un sistema particular y la implementación del compilador: pueden ser obtenidos usando la class numeric_limits (esto lo veremos en un capítulo posterior). Si por alguna razón, se necesitan tipos de tamaños específicos, la biblioteca define ciertos alias del tipo de tamaño fijo en el encabezado <cstdint>.
Los tipos descritos anteriormente (carácteres, enteros, punto flotantes y booleano) se conocen colectivamente como tipos aritméticos. Pero existen dos tipos fundamentales adicionales: vacío void, que identifica la falta de tipo; y el tipo nullptr que es un tipo especial de puntero. Ambos tipos serán discutidos más adelante en un próximo capítulo donde trataremos especificamente sobre punteros.

C++ admite una amplia variedad de tipos basados en los tipos fundamentales discutidos anteriormente; estos otros tipos se conocen como tipos de datos compuestos y son una de las principales fortalezas del lenguaje C++; estos los veremos también con más detalles en capítulos posteriores.

Declaración de Variables:

C++ es un lenguaje fuertemente tipado, y requiere pues que cada variable sea declarada con su tipo antes de su primer uso. Esto informará al compilador dos cosas importantes:
  • el tamaño a reservar en memoria para esta variable y
  • cómo interpretar su valor. 
La sintaxis para declarar una variable en C++ es sencilla, simplemente escribimos el tipo seguido por el nombre de la variable(es decir, su identificador). Por ejemplo:
int a;
float minumero;
Estas son dos declaraciones de variables que son completamente válidas. La primera declara una variable del tipo int con el identificador a. El segundo declara una variable del tipo float con el identificador minumero. Una vez declaradas, las variables a y minumero se podran utilizar en el resto del ámbito scope del programa. En el caso de que usted quiera declarar más variables del mismo tipo, estas podrán escribirse separando sus identificadores con comas. Aquí un ejemplo:
int a, b, c;
Esto declara 3 variables (a, b y c), todas ellas de tipo int y tiene exactamente el mismo significado que:
int a;
int b;
int c;
Para ver cómo se ven las declaraciones de variables en acción dentro de un programa, echemos un vistazo a todo el código C++ del ejemplo sobre su memória mental propuesto al principio de este artículo:

//Operación con variables

#include <iostream>
using namespace std;

int main ()
{
// declarando variables
int a, b;
int resultado;

// procesando:
a = 5;
b = 2;
a = a + 1;
resultado = a - b;

// imprimiento el resultado en pantalla
cout << resultado;

// cerrando el programa
return 0;
}

No se preocupe si algo diferente a las declaraciones de las variables le parece extraño. La mayor parte se explicará con mayor profundidad en los próximos capítulos.

Inicialización de variables 

Cuando se declararon las variables en el ejemplo anterior, estas tuvieron un valor indeterminado hasta que le asignamos un valor por primera vez.
Pero, ¿es posible que una variable tenga un valor específico desde el momento en que se declara?, sí claro,  a esto justamente se le llama inicialización de una variable!
En el lenguaje C++, hay tres maneras de inicializar una variable. Todas equivalentes y recuerdan la evolución del lenguaje a lo largo de los años:
  • El primero, conocido como inicialización c-like (debido a que se hereda del lenguaje C), este consiste en anexar un signo igual seguido del valor desde el cual se inicia la variable:

tipo identificador = valor_inicial;
Por ejemplo si queremos:
  • declarar una variable del tipo int llamada x e inicializarla con un valor de 0 desde el mismo momento en que se declara, escribiremos esto:
int x = 0;
  • Un segundo método, conocido como inicialización del constructor (introducido por el lenguaje C++), incluye el valor inicial entre paréntesis ().
tipo identificador (valor_inicial)
Por ejemplo:
int x (0);
  • Por último, tenemos un tercer método, conocido como Inicialización Uniforme, que es similar al anterior, pero con llaves en lugar de paréntesis (este fué introducido por la revisión de la norma C++, en 2011):
tipo identificador {valor_inicial};
Por ejemplo:
int x {0};
Las 3 formas de inicializar variables son válidas y equivalentes en C++, no se le olvide de aprenderlas de manera firme!:

Deducción de Tipos : auto y decltype

Cuando una nueva variable es inicializada, el compilador puede descubrir cual es el tipo de variable de forma automática, todo por medio del inicializador; ¿sabías? pues sí, así es. 
Para esto, simplemente basta usar auto  como el especificador del tipo para la variable Por ejemplo:

int foo = 0;
auto bar = foo; // esto es lo mismo que: int bar = foo;
Aqui, la variable bar es declarada como teniendo un tipo auto; por lo tanto, el tipo de bar es el tipo de valor utilizado para iniciarla: en este caso utiliza el tipo de foo, que es int.
Las variables que no se inicializan también pueden hacer uso de la deducción de tipo, pero estas utilizaran el especificador decltype:
int foo = 0;
decltype(foo) bar; // esto es lo mismo que: int bar;
Aquí, se declara que bar tiene el mismo tipo que foo.
auto y decltype son potentes funciones que fueron recientemente agregadas al lenguaje C++.
Pero las características de deducción de tipo que introducen están destinadas a ser utilizadas cuando el tipo no se puede obtener por otros medios o cuando se utiliza para mejorar la legibilidad del código. Estos dos ejemplos encima indicados, no son probablemente ninguno de estos casos. De hecho, probablemente disminuyen la legibilidad, ya que al leer el código, uno tiene que buscar el tipo de foo para saber realmente el tipo de bar. Mas detalles de este tema los encontraremos en un capítulo posterior, donde iremos paso a paso aprofundandonos!.

Introducción a Strings

Los tipos fundamentales representan los tipos más básicos manejados por máquinas donde se puede ejecutar código. Pero uno de los principales puntos fuertes del lenguaje C++ es su rico conjunto de tipos compuestos, de los cuales los tipos fundamentales son simples bloques de construcción!
Un ejemplo de tipo compuesto es la class string. Las variables de este tipo compuesto son capaces de almacenar secuencias de caracteres, tales como palabras u oraciones. Una característica muy útil!.
Una primera diferencia con los tipos de datos fundamentales es que para declarar y utilizar objetos (variables) de este tipo, el programa debe incluir el header(encabezado)  donde se definirá el tipo dentro de la biblioteca estándar (header <string>: #include <string>), veamos un ejemplo práctico de esto:
Como puede usted ver en este ejemplo, los strings se pueden inicializar con cualquier literal de string válido, así como las variables de tipo numérico que se pueden inicializar con cualquier literal numérico válido. Al igual que con los tipos fundamentales, todos los formatos de inicialización son válidos con string:

string mistring = "Esta es una string";
string mistring ("Esta es una string");
string mistring {"Esta es una string"};
¿Los strings pueden realizar todas las otras operaciones básicas que los tipos fundamentales?, claro que sí!, estos por ejemplo pueden ser declarados sin un valor inicial y cambiar su valor durante la ejecución:

Nota Importante

Al insertar el manipulador endl se termina la línea (y lo que hace este es imprimir un carácter de nueva línea vaciando el búfer stream).
Como antes afirmamos la class string es un tipo compuesto no lo olvidemos. 
Como podemos ver en el ejemplo anterior, los tipos compuestos se utilizan de la misma manera que los tipos fundamentales: la misma sintaxis se utiliza para declarar variables y para inicializarlas.
Para obtener más detalles sobre strings de C++ estándar, consulte este site.
Culminado y entendido este paso, habremos llegado a una parte importante de conocimientos para empezar a trabajar con C++, no podemos desistir si queremos llegar a desenvolver cualquier cosa con este maravilloso lenguaje!, más adelante veremos lo que son las Constantes en este lenguaje con lo cual iremos practicando con varios programas más complejos. No deje de practicar, eso es vital!
La mejor manera de aprender un lenguaje de programación es escribiendo programas. Por lo general, el primer programa de principiantes es un programa llamado "Hello World", que simplemente imprime (print) "Hello World" en la pantalla de su computadora. Aunque este sea muy simple, contiene los componentes fundamentales que los programas C++ deben tener, veamos:
//mi primer programa en C++
#include <iostream>

int main()
{
std::cout << "Hello World!";
}

La figura anterior muestra el código C++ para este programa inicial. Luego el display de pantalla verde, nos muestra el resultado cuando el programa es ejecutado por un ordenador.

Explicando el Código línea por línea: 

Línea 1:


//mi primer programa en C++
Dos barras inclinadas comenzando, indican que el resto de la línea es un comentário insertado por el programador, pero que no tiene ningún efecto en el comportamiento del programa. Normalmente, los programadores los usan para incluir explicaciones u observaciones cortas sobre el código o el programa.
En este caso, se trata de una breve descripción introductoria del programa.

Línea 2:

#include <iostream>

Las líneas que comienzan con un signo hash (#) son directivas leídas e interpretadas por aquello que se conoce como preprocesador. Son líneas especiales interpretadas antes de que empiece la compilación del programa en curso. En este caso, la directiva #include <iostream>, indica al preprocesador que incluya una sección de código C++ estándar, conocida como encabezado iostream, el cual nos permite realizar operaciones de entrada y salida estándar, como escribir la salida de este programa (osea "Hello World!") en la pantalla.

Línea 3:


 
Las líneas en blanco no tienen ningún efecto en un programa. Simplemente mejoran la legibilidad del código.

Línea 4:

int main()

Esta línea inicia la declaración de una función. Esencialmente, una función es un grupo de sentencias de código que reciben un nombre: en este caso, esta dándole el nombre de "main" ó "principal" al grupo de instrucciones de código que le siguen.
Las funciones serán discutidas con mas detalles en un capítulo posterior, pero esencialmente, su definición se introduce con una sucesión de un tipo (int), un nombre (main) y un par de paréntesis(), que pueden incluir opcionalmente parámetros.
La función llamada "main" es una función especial en todos los programas C++; ella es llamada cuando se ejecuta el programa. La ejecución de todos los programas de C++ comienzan con esta función, independientemente de dónde se encuentre la función dentro del código.

Línea 5:

{ y } 
La llave abierta { en la línea 5 indica el comienzo de la definición de la función main y la llave de cierre } en la línea 7, indica su final. Todo entre estos apoyos es el cuerpo de la función que define lo que sucede cuando es llamada la función main. Todas las funciones utilizan llaves para indicar el comienzo y el final de sus definiciones.

Línea 6:


std::cout << "Hello World!";
Esta línea es una declaración de C++. Se considera una declaración a una expresión que realmente puede producir algún efecto. Es la 'carne' de un programa, la cual especifica su comportamiento real. Las sentencias se ejecutan en el mismo orden en que aparecen en el cuerpo de la función.
Esta declaración tiene 3 partes:
  1. std::cout
    que identifica el dispositivo de salida "cout" de caracteres estándar "std" (normalmente la pantalla de la computadora) ambos enlazados por :: que es el operador de Resolução de escopo que permite interactuar con "cout" que es la función contenida en la directiva iostream.
  2. << "Hello World!";
    el operador de inserción "<<"  indica que lo que sigue se insertará en std::cout. 
  3. Finalmente, una oración entre comillas ("Hello World!"), que es el contenido insertado en la sálida estándar. 
      • Observe que la sentencia termina con un punto y coma (;). Este carácter lo que hace es marcar el final de una declaración. Todas las instrucciones de C++ deben finalizar con un ';'. Uno de los errores de sintaxis más comunes en C++ es olvidar de terminar una instrucción con ';'.
El programa ha sido estructurado en diferentes líneas y correctamente sangrado, con el fin de hacer más fácil su entendimiento. Pero C++ no tiene reglas estrictas sobre sangría o sobre cómo dividir instrucciones en diferentes líneas. Por ejemplo en lugar de:
 

int main()
{
std::cout << " Hello World!";
}
Podríamos haber escrito lo siguiente:
int main () { std::cout << "Hello World!"; }

Todo en una sola línea y esto habría tenido exactamente el mismo efecto que el código anterior. En C++, la separación entre sentencias se especifica con un punto y coma (;), entonces la separación en líneas diferentes nada importa para este propósito. Muchas declaraciones pueden ser escritas en una única línea, o cada declaración puede estar en su propia línea. La división del código en diferentes líneas sirve apenas para tornarlo más legíble y esquemático para los seres humanos que pueden verlo, pero obviamente no tiene cualquier efecto sobre el comportamiento real del programa.

Ahora vamos a adicionar más una declaración a nuestro primer programa:
//mi segundo programa en C++
#include <iostream>

int main ()
{
std::cout << "Hello World! ";
std::cout << "Yo soy una nueva declaración";
}
En este caso el programa está ejecutando 2 inserciones dentro de std::cout en 2 sentencias diferentes. Una vez más, la separación en diferentes líneas de código simplemente sirve para dar mayor legilibilidad al programa, ya que la función "main" podría haber sido perfectamente válida si la definimos así:
int main () { std cout << "Hello World!"; std::cout << "Yo soy una nueva declaración";}
Tambien podría haber sido dividido en más líneas de código en vez de eso:

int main ()
{
std::cout <<
"Hello World! ";
std::cout <<
"Yo soy una nueva declaración";
}
Y el resultado habria sido el mismo que en los ejemplos anteriores.

No olvidemos que: Las Directivas de Preprocesador (Aquellas que comienzan con # no lo olviden) estan fuera de esta regla general, una vez que no son declaraciones. Son líneas leídas y procesadas por el pre-processador antes de que comience la compilación apropiada. Las directivas de preprocesador deben especificarse en su propia línea y, dado que no son declaraciones, no tienen que terminar con un punto y coma (;).

Comentários:

Como se señaló anteriormente, los comentários no afectan al funcionamiento del programa; sin embargo, proporcionan una herramienta importante para documentar directamente dentro del código fuente lo que hace el programa y cómo funciona.
C++ admite dos formas de comentar el código:
   
//Comentário en líneas
/*Comentário en Bloque */
El primero de ellos, conocido como comentário de línea, descarta todo lo que se encuentre en frente de la misma línea donde están las barras inclinadas //, osea solo sirve para una misma línea donde estan esas dos barras.
El segundo es conocido como comentario de bloque, este descarta todo lo que se encuentre entre los símbolos /* y */, tiene la opción de incluir múltiples líneas. Veamos un ejemplo:
/*  mi segundo programa en C++
con más comentarios */

#include <iostream>

int main()
{
std::cout << "Hello World"; //Imprime Hello World!
std::cout << " Yo soy la segunda declaración";
}
Si los comentarios se incluyen dentro del código fuente de un programa sin utilizar las combinaciones // ó /* */, el compilador los toma como si fueran expresiones de C++, lo más probable es que la compilación falle con uno o varios mensajes de error.

Uso del namespace std

Si usted ha visto código C++ en algun otro momento de su vida, puede haber visto el cout que es utilizado en vez de std::cout. Ambos nombran al mismo objeto: el primero utiliza su nombre no cualificado (cout), mientras que el segundo lo cualifica directamente dentro del espacio de nombres estándar std (tal es el caso de std::cout).
Cout forma parte de la biblioteca estándar y todos los elementos de la biblioteca estándar de C++ se declaran dentro de lo que se llama el namespace std.
Para referirse a los elementos del namespace std, un programa cualificará cada uno de los usos de los elementos de la biblioteca(como lo hemos hecho prefijando cout con std::) ó introducirá visibilidad a sus componentes. La forma más común de introducir la visibilidad de estos componentes es a traves de la utilización de declaraciones, veamos:   
using namespace std;
La declaración anterior permite que se acceda a todos los elementos del 'namespace std' de manera no cualificada (osea sin el prefijo std::): "using namespace std" "usando namespace std".
Conocido esto, el último ejemplo puede ser reescrito para hacer usos no cualificados de cout, miren como quedaría y practiquen:
//mi segungo programa en C++
#include <iostream>
using namespace std;

int main()
{
cout << "Hello World!";
cout << "Yo soy una nueva declaración";
}
Ambas formas de acceder a los elementos del namespace std (cualificación explícita y usando declaraciones) son válidas en C++ y producen exactamente el mismo comportamiento. Pero para simplificar y mejorar la legibilidad, los ejemplos de estos tutoriales usarán más a menudo este último enfoque con el uso de declaraciones, aunque tenga siempre en cuenta que la cualificación explícita es la única manera de garantizar que nunca se produzcan colisiones de nombres.
Culminado y entendido esto, habremos llegado a una parte importante de conocimientos para empezar a trabajar con C++, no podemos desistir si queremos llegar a desenvolver cualquier cosa con este maravilloso lenguaje!
Las herramientas necesarias para conseguir realizar nuestras primeras aplicaciones con C++ son:
  • Una Computadora y 
  • Una herramienta de compilación capaz de compilar código C++ así como construir programas para ejecutarlos en este. Es recomendable usar el compilador GCC, que lo encuentras para descarga en este link.
C++ es un lenguaje que ha evolucionado muchísimo a través de los años y esta página web trae consigo muchas características agregadas recientemente al lenguaje. Por lo tanto, para seguir correctamente los tutoriales se necesita un compilador reciente. Esto apoyará (aunque sea sólo parcialmente) las característcias introducidas por las normas del año 2011.

¿Qué es un Compilador?

Los ordenadores entienden sólo un idioma y ese lenguaje consiste en un conjunto de instrucciones hechas de "unos" y "ceros". A este lenguaje se le llama apropiadamente Lenguaje de Máquina.
Una sóla instrucción a una computadora podría verse de la siguiente forma:
El programa de lenguaje de máquina de un ordenador que permita a un usuario ingresar 2 números, sumar los 2 números y mostrar el total; podría incluir estas instrucciones de código de máquina:
Como usted puede imaginar, la programación de una computadora directamente en el lenguaje de máquina utilizando sólo "ceros" y "unos" es muy tedioso y propenso a errores.
Para facilitar la programación, se han desarrollado diversos lenguajes de alto nivel. Los lenguajes de alto nivel también facilitan que los programadores inspeccionen y comprendan mejor sus programas.
Esta es una parte del código escrito en C++ que logra el mismo propósito:

int a, b, suma;

cin >> a;
cin >> b;

suma = a + b;
cout << suma << endl;



Ahora un ejemplo funcional para esto, veamos:
#include<iostream>
using namespace std;
int main(){
int a;
int b;
int suma;
cout << "Ingrese el primer numero entero: \n";
cin >> a;
cout << "Ingrese el segundo número entero \n";
cin >> b;
cin.ignore();
suma = a + b;
cin.get();
result 0;
}

Veamos el resultado en nuestro IDE:

Incluso si usted no puede entender el código anterior, debería ser capaz de apreciar cuánto más fácil será programar en el lenguaje C++ en comparación con el lenguaje de máquina.
Debido a que una computadora sólo puede entender el lenguaje de máquina y nosotros deseamos escribir en lenguajes de alto nivel, los lenguajes de alto nivel tienen que ser reescritos (traducidos) en lenguaje de máquina en algún momento. Esto se hace mediante programas especiales llamados compiladores, intérpretes o ensambladores que están integrados en las distintas aplicaciones de programación.
C++ está diseñado para ser un lenguaje compilado, lo que significa que generalmente se traduce en lenguaje de máquina que  podrá ser entendido directamente por el sistema, haciendo que el programa que se ha generado, sea altamente eficiente. Para ello, se necesita un conjunto de herramientas, conocidas como la "cadena de herramientas de desarrollo" cuyo núcleo es un compilador y su enlazador.

Programas de Consola

Son programas que utilizan texto para comunicarse con el usuario del programa y con el entorno, estos imprimen texto en la pantalla o leen entradas que se insertan desde un teclado del ordenador.
Son programas con los que se puede interactuar fácilmente y generalmente tienen un comportamiento idéntico en todas las plataformas. Además son fáciles de implementar y por lo tanto son muy útiles para aprender los conceptos básicos de un lenguaje de programación.
No olvidemos que la forma de compilar los programas de consola dependen de la herramienta que se está utilizando para dicho propósito.
La forma más fácil para que los principiantes puedan compilar programas escritos en el lenguaje C++, es utilizando un Entorno De Desarrollo Integrado (IDE). Un IDE generalmente integra varias herramientas de desarrollo, incluyendo un editor de texto y algunas herramientas para compilar programas directamente dentro de él.
Con estos conceptos bien aprendidos y entendidos conseguiremos comenzar de forma más provechosa nuestra camino hacia el aprendizaje de este maravilloso lenguaje! 
Las computadoras son algunas de las herramientas más versátiles que tenemos disponibles hoy en día. Estas son capaces de:
  • Realizar impresionantes hazañas de computación, 
  • Permitir intercambiar información fácilmente, independientemente de su ubicación física.
  • Simplifican muchas tareas diarias y nos permiten automatizar muchos procesos que serian tediosos para realizar de otra manera. 
Sin embargo, las computadoras aún no son inteligentes como nosotros; a estas se les debe decir en términos inequívocos, exactamente lo que se supone que deben hacer y además no olvidemos que sus lenguas nativas son muy diferentes a todo lo que hablamos.
Por lo tanto, hay una tremenda barrera de idiomas entre una persona que desea que una computadora haga algo y la computadora que normalmente requiere instrucciones en su idioma nativo ó "código de máquina", para hacer cualquier cosa. Hasta ahora, las computadoras averiguan lo que deben hacer basándose en programas que creamos, los cuales son conjuntos de instrucciones que la computadora puede entender y seguir.

Visión General de los Programas y los Lenguajes de Programación

Con el fin de comunicar mejor a nuestros ordenadores qué es exactamente lo que queremos que hagan, hemos desarrollado una amplia gama de lenguajes de programación para facilitar el proceso de comunicación.
Dependiendo del tipo de proyecto, hay muchos factores que deben tenerse en cuenta al elegir un lenguaje:

Lenguaje Compilado, interpretado o compilado por JIT:

Los lenguajes compilados son aquellos que se traducen al idioma nativo de la máquina de destino mediante un programa denominado compilador. Esto puede dar como resultado un código muy rápido, especialmente si el compilador es eficaz en la optimización, sin embargo el código resultante puede no tener una portabilidad eficaz  en todos los sistemas operativos y el proceso de compilación puede tomar un tiempo.
Los lenguajes Interpretados son los leídos por un programa llamado intérprete y ejecutados por ese programa. Aunque son tan portátiles como su intérprete y no tienen tiempos de compilación largos, además suelen ser mucho más lentos que un programa compilado equivalente.
Por último los lenguajes compilados just-in-time (o compilados por JIT),  son lenguajes que se compilan rápidamente cuando los programas escritos en ellos necesitan ser ejecutados (normalmente con muy poca compilacion.), lo que ofrece un equilibrio entre rendimiento y portabilidad.

Alto o Bajo Nivel de un Lenguaje: 

Esto se refiere a lo que la naturaleza del lenguaje refleja en el sistema subyacente. En palabras más fáciles el nivel del lenguaje se refiere a la similitud del lenguaje con el idioma nativo de una computadora. Cuanto más alto es el nivel, menos similar es.
Un lenguaje de bajo nivel es generalmente bastante similar al código de máquina y por lo tanto es más adecuado para programas como controladores de dispositivos o programas de alto rendimiento que realmente necesitan acceso al hardware.
Generalmente, el término esta reservado para el propio código de máquina y los lenguajes de ensamblaje, aunque muchos idiomas ofrecen elementos de bajo nivel. Debido a que un lenguaje de bajo nivel está sujeto a todos los matices del hardware al que accede, es difícil entonces ser portable en otras plataformas. Los lenguajes de bajo nivel prácticamente nunca se interpretan, ya que esto generalmente esta en contra de su propósito.
Un lenguaje de alto nivel se centra en conceptos que son fáciles de entender por un humano, como objetos o funciones matemáticas. Por lo general, un lenguaje de alto nível es más fácil de entender que un lenguaje de bajo nivel y usted puede tardar menos tiempo en desarrollarlo en comparación con un lenguaje de bajo nivel. Sin embargo, cabe rescatar que no es imposible mezclar funcionalidades de alto nivel y bajo nivel en un lenguaje.

Sistemas de Tipos:

Un sistema de tipos se refiere a las reglas que deben seguir los diferentes tipos de variables. Algunos lenguajes (incluyendo la mayoria de los lenguajes de ensamblaje) no tienen tipos y por lo tanto esta sección no se aplica a ellos. No en tanto, como la mayoría de lenguajes (incluyendo C++) tienen tipos, esta información es sumamente importante.
Fuerza del tipado: Fuerte ó Débil
Un sistema de tipado fuerte pone restricciones sobre cómo los diferentes tipos de variables se pueden convertir entre sí sin ninguna conversion de declaraciones. Un sistema de tipado fuerte ideal prohibiría "lanzamientos implícitos"  a los tipos que no tienen ningun sentido, tal como un entero a un objeto Fruit, mientras que un sistema de tipado débil trataría de encontrar alguna forma de hacer funcionar el trabajo asignado.
Expresión del tipado: Manifiesto ó Inferido
Eso trata de cómo el compilador/intérprete de un lenguaje infiere los tipos de variable. Muchos lenguajes requieren que los tipos de variables se definan explícitamente y, por tanto, se basan en el tipado manifiesto. Algunos, sin embargo, infieren el tipo de variable basada en los contextos en los que se utiliza, y por lo tanto utilizan el tipado inferido.

Comprobación de Tipado: Estático o Dinámico

Si un lenguaje se escribe de forma estática, entonces el compilador/intérprete hace la comprobación de tipado una vez antes de ejecutar/compilar el programa. Si se selecciona dinámicamente el lenguaje, los tipos se comprueban en tiempo de ejecución.

Seguridad del Tipado: Seguro o Inseguro

Estos se refieren al grado en que un lenguaje prohíbe las operaciones en las variables escritas, que podrían conducir a un comportamiento indefinido o errores. Un lenguaje seguro hará más para asegurar que tales operaciones o conversiones no se produzcan, mientras que un lenguaje inseguro le dará más responsabilidad al usuario en este sentido.

Paradigmas Soportados:

Un paradigma de programación es una metodología o forma de programación que soporta un lenguaje de programacion;
Aquí esta un resumen de algunos paradigmas comunes:
Declarativa: aquí las sentencias que se utilizan, describen el problema que se quiere solucionar; se programa diciendo lo que se quiere resolver a nivel de usuario, pero no las instrucciones necesarias para solucionarlo. Esto último se realizará mediante mecanismos internos de inferencia de información a partir de la descripción realizada.
Funcional: La programación funcional es un subconjunto de la programación declarativa que trata de expresar problemas en términos de ecuaciones y funciones matemáticas. Se sale de su camino para evitar los conceptos de estados y variables mutables que son comunes en lenguajes imperativos.
Imperativo: En la programación imperativa se describe paso a paso un conjunto de instrucciones que deben ejecutarse para variar el estado del programa y hallar la solución, es decir, un algoritmo en el que se describen los pasos necesarios para solucionar el problema.
Generica:  La programación genérica se centra en la escritura de algoritmos de esqueleto en terminos de tipos, que se especificaran cuando el algoritmo se utilize realmente, lo que permite cierta tolerancia a los programadores que desean evitar estrictas reglas de tipificación fuerte. Puede ser un paradigma muy poderoso si esta bien implementado. En palabras más entendibles se dice que es un tipo de programación que está mucho más centrado en algoritmos que en datos. La idea de esta forma de programar pretende generalizar las funciones utilizadas para que puedan usarse en más de una ocasión.
Estructurado: Los lenguajes de programación estructurados tienen como objetivo proporcionar alguna forma de estructura notable a un lenguaje, como el control intuitivo sobre el orden en que se ejecutan las sentencias. Tales lenguajes generalmente desprecian "saltos", como los proporcionados por la declaracion goto en C y C++.
De Procedimiento: Aunque a veces se utiliza como sinónimo de programacion imperativa, un lenguaje de programación de procedimiento tambien puede referirse a un lenguaje de programacion estructurado imperativo que apoya el concepto de procedimientos y subrutinas (tambien conocidas como funciones en C y C++).
Orientado a Objetos: Este es un subconjunto de la programación estrucutrada, que expresa programas en términos de "objetos", que estan diseñados para modelar objetos como en el mundo real. Tal paradigma permite que el código se reutilice de manera extraordinaria y se entienda de manera extremamente fácil.

Estandarización:   

Estandarizar no significa que todas las aplicaciones construidas deban lucir igual, ni siquiera que las secciones de un sitio web por ejemplo deban llamarse de una o de otra manera, significa que las aplicaciones deben construirse en base a normas.
Algunos lenguajes estan estandarizados por el Instituto Americano de Estándares Nacionales (ANSI), algunos están estandarizados por la Organización Internacional de Normalización (ISO) y algunas tienen un estandard informal pero "de facto" que no son mantenidas por nignuna organizacion de estándares.

Características de C++ como lenguaje:

Ahora que toda la teoría necesaria ha sido cubierta, es posible explicar lo que C++ tiene para ofrecer como un lenguaje de programación; C++ es un lenguaje abierto ISO-Estandarizado. Durante un tiempo, C++ no tenía un estándar oficial y fué mantenido por un estándar de facto, sin embargo desde 1998, C++ está estandarizado por un comité de la ISO.
Se puede acceder a su página aquí.
C++ es un lenguaje compilado, es decir se compila directamente al código nativo de una maquina, lo que le permite ser uno de los lenguajes más rápidos del mundo, si está optimizado.
C++ es un lenguaje fuertemente tipado e inseguro; esto quiere decir que el lenguaje espera que el programador sepa lo que él o ella está haciendo, pero permite cantidades increíbles de control como resultado.
C++ apoya al tipado manifiesto e inferido; a partir del último estándar de C++; este admite escritura tanto manifiesta como inferida, permitiendo flexibilidad y un medio de evitar la verbosidad donde se desee.
C++ soporta la comprobación estática y dinámica del tipo. C++ permite que las conversiones de tipo se comprueben en tiempo de compilacion o en tiempo de ejecución, ofreciendo de nuevo otro grado de flexibilidad. Sin embargo, la mayoria de las comprobaciones de tipo C++ son estáticas.
C++ ofrece muchas opciones de paradigmas. C++ ofrece un soporte notable para los paradigmas de programacion de procedimientos, genéricos y orientados a objetos, con muchos otros paradigmas pósibles.
C++ es portátil: como uno de los idiomas más utilizados del mundo y como un lenguaje abierto, C++ tiene una amplia gama de compiladores que se ejecutan en muchas plataformas diferentes que lo apoyan. El Código que utiliza exclusivamente la biblioteca estándar de C++ se ejecutará en muchas plataformas con pocos o ningun cambio.
C++ es compatible con C: C++ es compatible con casi todo el código C. C++ puede utilizar C con pocas modificaciones del código de las bibliotecas.
C++ tiene un soporte increíble de bibliotecas: una búsqueda de biblioteca en el popular sitio web de gestion de proyectos SourceForge producirá más de 3000 resultados para bibliotecas C++. Puede encontrar un enlace a los resultados de busqueda aqui.
Con estos conceptos bien aprendidos y entendidos conseguimos comenzar de forma más provechosa nuestra caminada hacia el aprendizaje de este maravilloso lenguaje!