En estos streams de salida, cuando escribes, no se envía instantaneamente (a la consola, en este caso). Se almacena en un buffer. Cuando el buffer se llena, o se da otra condición, el buffer se envía y se muestra en la consola lo que habíamos escrito. Esto generalmente ocurre en cuanto el programa tiene tiempo, se detiene, o cuando lo forzamos a hacerlo.
Existe otra función, que es flush:
Código
cout << flush;
Esto fuerza al buffer a vaciarse. No es muy común verla, pero es importante.
endl hace 2 cosas: primero, escribe un '\n', luego, hace un flush.
endl sería similar a:
Código
Lo que interesa es ver que no es igual a un salto de línea sin más: además, hace el flush.
cout << '\n' << flush;
En los programas que hagas, no deberías preocuparte: usar endl suele ser la mejor alternativa. Sin embargo, tenlo en cuenta en el futuro.