Comentarios

Los comentarios de C siguen siendo válidos en C++. Por ejemplo:

  /* Esto es un comentario */

C++ define ademas otra forma de comentar una línea. Un comentario comienza con //, y continúa hasta el final de esa línea, donde termina automáticamente:

  // Esto es un comentario

El nuevo método impide comentar inadvertidamente varias líneas de código. Esto podía ocurrir en C al olvidar incluir el final de la notación de comentario. Las dos formas de comentario pueden anidarse en C++.

Existe todavía otra forma de comentario, y es utilizando el preprocesador, vía #ifdef, #endif. Este es el mejor método para comentar varias líneas de código, ya que /* y */ no funcionarán si el código contiene comentarios del mismo tipo:

#if 0
  a = b + c;
  x = u * v;
#endif

El pre-procesador

El preprocesador es una forma de indicarle al compilador de C++ cómo ha de manipular el programa antes de compilarlo. Por ejemplo, podemos querer dividir un programa muy grande en dos ficheros. Entonces, habría que decirle al pre-procesador que añada un fichero al otro antes de compilar. El compilador las verá entonces como un único fichero, aunque en realidad son dos.
La forma de comunicarse con el preprocesador es usando # como primer carácter de una línea, seguido por el comando adecuado. Por ejemplo, include añade otro fichero en ese punto:

   #include "horario"

añade un fichero llamado "horario" al programa, en el lugar donde esté esta línea. Así, si el fichero que contiene el #include es:

   Las clases de C++ serán
   # include "horario"
   a partir de hoy.

y el fichero "horario" contiene:

  todos los lunes, miércoles y viernes de doce a dos

el compilador leerá:

   Las clases de C++ serán
   todos los lunes, miércoles y viernes de doce a dos
   a partir de hoy.

Cabeceras

La principal utilidad del preprocesador es incluir headers o cabeceras. La idea es que cuando se quiera llamar a funciones que se construyen a partir del lenguaje (como sacar algo por pantalla), se utiliza #include para incluir el fichero que define esas funciones.
Las cabeceras más utilizadas son: iostream.h, para imprimir por pantalla y leer desde el teclado, y math.h, que contiene funciones matemáticas, como raíces cuadradas y logaritmos.
Estos ficheros se llaman cabeceras de sistema, porque no han sido creadas por el usuario, sino que son parte del compilador. Para incluirlas, se ponen entre corchetes:

  #include <iostream.h>
  #include <math.h>

Esto indica al preprocesador que queremos incluir cabeceras de sistema, y no otras creadas por nosotros mismos.

Cout

C++, al igual que C, no tiene operaciones de entrada/salida como parte del lenguaje en sí, sino que define la librería stream para añadir estas funciones. La salida por pantalla se hace a través de cout, pero es algo diferente a la función printf(), ya que no tenemos que indicarle el tipo de la variable que queremos imprimir. Así se escribe en C++ el tradicional ejemplo "Hello, world":

  #include <iostream.h>

  main()
  {
   cout << "Hello, world";
  }

El operador <<, llamado operador de inserción, le dice al sistema que imprima la variable que le sigue, pero deja que el sistema decida cómo imprimir los datos. No le hemos indicado el tipo de la variable que queremos imprimir, como se hacía con printf(). Es el sistema el que determina el tipo de la variable, y lo imprime adecuadamente. Tampoco hemos formateado la salida. De nuevo es el sistema el que determina el número de cifras, el de espacios en blanco ...
Se pueden utilizar los caracteres de escape de C. Por ejemplo, en el programa anterior podemos añadir un retorno de carro:

  #include <iostream.h>

  main()
  {
   cout << "Hello, world\n";
  }

cout saca por pantalla cualquier tipo de dato estándar que existe en C++, bien sea un carácter, un número o movimientos especiales del cursor,como \n en el ejemplo anterior. Veamos otro programa:

  #include <iostream.h>
  main()
  {
   int a;
   float b;

   a = 4;
   b = 52.2;

   cout <<"Vamos a imprimir un número entero:";
   cout << a;
   cout <<'\n';
   cout <<"Y ahora uno real:";
   cout << b;
   cout <<'\n';
  }

La salida de este programa es:

Vamos a imprimir un número entero: 4
Y ahora uno real: 52.2

El programa tambien podría haber sido escrito de la siguiente forma:

  #include <iostream.h>

  main()
  {
   int a;
   float b;

   a = 4;
   b = 52.2;

   cout <<"Vamos a imprimir un número entero:" << a <<'\n';
   cout <<"Y ahora uno real:" << b <<'\n';
  }

En este ejemplo, hemos indicado al compilador que imprima una cadena de caracteres, seguida por un entero. Después, hemos imprimido una cadena distinta, seguida de un número real. También hemos utilizado el retorno de carro, '\n'. Hemos mandado imprimir un número real sin indicar su tipo. El sistema elige la salida apropiada basándose en su tipo. Hemos perdido un poco de control, porque no tenemos control sobre el número de dígitos significativos que imprimirá. Sin embargo, la función printf() se puede utilizar en C++, y las dos formas de salida por pantalla pueden mezclarse en un programa.
Veamos algunas características adicionales de la librería stream. El siguiente programa imprime el valor de un numero en formato decimal (dec), octal (oct) y hexadecimal(hex).

#include <iostream.h>

main()
{
  int numero = 31;
  int numero2 = 23;

  cout <<"El valor decimal de número es:" << numero << '\n';
  cout <<"El valor octal de número es:" << oct <<numero << '\n';
  cout <<"El valor hexadecimal de número es:" << hex <<numero << '\n';

  cout <<"El valor hexadecimal de número2 es:" << numero2 << '\n';

}

La salida de este programa será:

El valor decimal de número es:31
El valor octal de número es:37
El valor hexadecimal de número es:1f
El valor hexadecimal de número2 es:17

Cuando se utiliza uno de los operadores especiales dec, oct o hex, todas las salidas sucesivas tomarán ese número base. Así, numero2 se imprime en hexadecimal debido a que esto es lo que se ha seleccionado en la anterior expresión cout. Si no se elige ninguno de estos operadores especiales, se toma por defecto el formato decimal.

Cin

Cin el el comando complementario de cout. Lee lo que se introduce desde el teclado, y en este sentido es también una caja negra, pues no sabemos cómo lo hace. La sintaxis es similar a la de cout:

  #include <iostream.h>
  main()
  {
   int numero;
   cout << "Introduce un número:";
   cin >> numero;
  }

El operador >>, llamado operador de extracción, es obviamente el opuesto de <<: toma los datos de cin y los asigna a numero. Ya que numero es un entero, cin convertirá la entrada en un entero, si es posible; si la entrada es "hola", por ejemplo, no debemos esperar que sea convertido a un entero.
Los operadores especiales dec, oct y hex también seleccionan la base para cin, de forma separada a cout. Si no se especifica ninguna, la entrada será por defecto decimal.

Códigos de escape

Los códigos de control se utilizan para producir un tabulador, retorno de carro, movimiento del cursor hacia atrás, incluso un pitido.
Los códigos de escape siempre comienzan por un " \ " seguido de una letra. Son:

\nNewline
\rRetorno de carro.
\tTabulador horizontal.
\vTabulador vertical.
\bEspacio hacia atrás
\aPitido
\\Barra hacia atrás
\?Interrogación
\'comilla simple
\"comilla doble
\0El entero 0.

También se puede representar un carácter como un número octal de uno, dos o tres dígitos (\ seguido de número octal), o como un número hexadecimal de uno, dos o tres dígitos (\x seguido de dígitos hexadecimales). Pero el uso de la notación numérica hace que los programas sean no portables entre máquinas con diferentes conjuntos de caracteres.

Cerr

Además de los operadores cout y cin hay otro operador, llamado cerr, que se utiliza para salida de errores. Esta salida no puede ser redirigida a un fichero, como las de cout y cin. Los tres operadores, cout, cin y cerr, corresponden a los punteros stdout, stdin y stderr de los programas en lenguaje C.

Variables

En C++, las variables pueden ser declaradas en cualquier lugar dentro de un programa. No es necesario, como en C, que sean declaradas al comienzo de una función o de un bloque. Esto puede ser útil en códigos grandes, cuando una variable se utiliza en un trozo de código lejano al comienzo del bloque. En este caso, el declarar el tipo de la variable cerca del lugar donde se va a utilizar puede hacer que el programa sea más fácil de leer.
Un ejemplo de esta posibilidad de C++ es la declaración del contador dentro de un bucle. Por ejemplo:

# include
main ()
{
  for (int i=0; i < 10; i++){
    cout << "hola" << '\n';
  }
}

El índice i se ha definido dentro del bucle for. En algunos compiladores, su validez se extiende hasta el final del bloque donde han sido definidos. En otros, como en el g++, siguen estando definidos hasta el final del programa.

Constantes

Las constantes se declaran, como en C, igual que una variable normal, pero añadiendo la palabra const delante. Por ejemplo, para declarar una constante con valor 14:

  const int numero = 14;

Estas constantes no pueden ser modificadas a lo largo del programa. Por eso deben ser definidas al mismo tiempo que declaradas. Sin embargo, el compilador no dará ningún mensaje de error si la constante no es inicializada.

Ejemplo.

#include <iostream.h>

void print(const int datos)
{
  cout << "El valor del indice es "<<datos<< '\n';
}

void main(void)
{
  const int inicio = 3;
  const int final = 9;

  for (int indice = inicio ; indice < final ; indice ++)
    print(indice);
}

const también se utiliza en la función print para indicar que el parámetro datos es una constante dentro de la función. Cualquier intento de asignar un nuevo valor a esta variable dará un error de compilación. La salida del programa anterior es:

El valor del indice es 3
El valor del indice es 4
El valor del indice es 5
El valor del indice es 6
El valor del indice es 7
El valor del indice es 8

Deben utilizarse en lugar de los #define de C. Pueden utilizarse para especificar las dimensiones de una matriz:

const int dimen = 20;
double vector[dimen];

Veamos un ejemplo de su utilización:

# include <iostream.h>

main ()
{
  const int MaxDim=3;
  int vector[MaxDim][MaxDim] = {{1,2,3},{4,5,6},{7,8,9}};

  for (int i=0; i < MaxDim; i++){
    for (int j=0; j < MaxDim; j++){
      cout << vector [i][j] << '\n';
      }
  } }

El índice exterior de la matriz es el que corre más rápido, al contrario de lo que sucedía en FORTRAN.

Referencias

Además de la declaración normal de variables, C++ permite que se declaren referencias como sinónimos de variables:

  #include <iostream.h>
  main()
  {
   int numero = 12;
   int &ref = numero;    cout << "número tiene el valor:" << numero << '\n';
   numero = 17;
   cout << "ref tiene el valor:" << ref << '\n';
  }

En este ejemplo, ref es una referencia a un entero, numero. Por tanto, ambos ocupan la misma localización de memoria. La referencia ref se convierte en sinónimo de la variable numero. Las dos operaciones:

numero ++;
ref ++;

tienen el mismo efecto.
Cuando se declara, una referencia debe ser siempre inicializada para referenciar a una variable. En caso contrario, el compilador dará error. Después de su inicialización, la referencia no puede cambiarse para referenciar a otra variable.

El operador ::

El operador :: (scope) es una característica nueva, puesto que no existe nada similar en C. Permite el acceso a una variable global aunque exista una variable local con el mismo nombre. El uso de :: delante del nombre de la variable, indica al compilador que debe utilizar la variable global, en lugar de la local, como se ilustra en el siguiente ejemplo:

Ejemplo.

#include <iostream.h>

int indice = 13;

main()
{
  float indice = 3.2567;

   cout <<"El valor de la variable local es:"<< indice << '\n';
   cout <<"El valor de la variable global es:"<< ::indice << '\n';

  ::indice = indice + 7;

   cout <<"El valor de la variable local es:"<< indice << '\n';
   cout <<"El valor de la variable global es:"<< ::indice << '\n';

}

La salida de este programa es:

El valor de la variable local es:3.2567
El valor de la variable global es: 13
El valor de la variable local es:3.2567
El valor de la variable global es: 13

Se recomienda no abusar del uso del operador ::. Es mejor utilizar diferentes nombres para las variables.

Operador ternario

Veamos un ejemplo:

int min (int a, int b) {
   int minimo;
   return a < b ? a : b;
}

Se evalúa primero la condición que precede a ? (en este caso, a > b). Si la condición es cierta, se ejecuta lo que sigue a ? (devuelve a). Si no, lo que sigue a : (devuelve b).

Conversiones de tipo

Las conversiones de tipo se hacen en C++ igual que en C:

c = (int)a;

En C++ las conversiones de tipo se pueden escribir también como una llamada a función:

c = int(a);

Veamos un ejemplo:

#include <iostream.h>

main()

{
  int a = 2;
  float x = 17.2, y = 8.95, z;

  z = (float)((int)x * (int)y);
   cout << z << '\n' ;
  z = (float)((int)(x * y));
   cout << z << '\n' ;
  z = x * y;

   cout << z << '\n' ;
  z = float(int(x) * int(y));
   cout << z << '\n' ;
  z = float(int(x * y));
   cout << z << '\n' ;
}


El resultado de la ejecución será:

136
136
153
153.045
136
136
153
153.045
Este método puede parecer más legible que el anterior método utilizado en C, pero los dos se pueden utilizar en C++. Incluso se pueden mezclar en un mismo programa, aunque ello quizás dificulte su lectura.