void funcion (int y = 2)
En este caso, estamos definiendo un valor, 2, que tomará la variable
y en caso de que no se pase nada en la llamada a la 
función:
funcion ();
Aunque no se ha pasado ningún argumento, la función 
trabajará. Como no se ha pasado ningún valor, y
toma el valor 2, y la función se ejecuta. Si quisiéramos pasar
un valor, se haría como en un caso normal:
funcion (231);
Ahora y toma el valor 231.
En el caso de que la función tenga una lista con varios argumentos,
los que tengan valores por defecto deben ir al final:
void funcion2 (int var1, int var2, int var3 = 0, int var4 = 0)
es la forma correcta de hacerlo. En cambio:
void funcion2 (int var1, int var2 = 0, int var3 = 0, int var4)
no es correcto. La razón es que si quisiéramos llamar a esta
función con tres argumentos, el compilador no distinguiría si
los valores que pasamos corresponden a var1, var2 y 
var3 o a var1, var3 y var4.
Resumiendo, hemos de seguir las siguientes reglas al declarar funciones con parámetros por
defecto:
Veamos un ejemplo:
 
int volumen (int longitud, int anchura = 2, int altura = 3); 
main() 
   cout << "Volumen =" << volumen (x,y,z) << '\n'; 
   cout << "Volumen =" << volumen (x,7) << '\n'; 
int volumen (int longitud, int anchura, int altura) 
# include <iostream.h>
El resultado de la ejecución de este programa será:
{
   int x = 10, y = 12, z = 15;
   cout << "Volumen =" << volumen (x,y) << '\n';
   cout << "Volumen =" << volumen (x) << '\n';
   cout << "Volumen =" << volumen (5,5,5) << '\n';
}
{
  return longitud * anchura * altura;
}
  Volumen = 1800.
  Volumen = 360.
  Volumen = 60.
  Volumen = 210.
  Volumen = 125.
En este programa: