Sobrecarga de operador

Iniciado por digimikeh, 15 Mayo 2019, 15:54 PM

0 Miembros y 1 Visitante están viendo este tema.

RayR

Cita de: digimikeh en 18 Mayo 2019, 02:21 AM
Gracias por las respuestas..

me queda claro todo, lo único si que no comprendí bien el por qué de dos cosas

por qué dices que no debo usar system("cls"); de que otra forma puedo limpiar pantalla?..  (conozco otro método que es insertar 100 lineas vacías pero esto haría que el contenido se muestre abajo)

y lo otro, es el std::endl;  la otra forma que conozco es con la secuencia de escape \n

Saludos!

Aunque no fui yo quien te mencionó esos dos puntos, aquí te comento algunas cosas.

Deberías evitar llamar a system(), ya que lo que sucede cuando la invocas no es simplemente que estés llamando a una función (como pasa con printf, scanf, etc.) sino que creas un proceso nuevo, en el cual ejecutas un programa distinto al tuyo, y todo eso es bastante pesado, y casi nunca se justifica. Es una práctica bastante mala.

Lamentablemente no hay una forma estándar de limpiar la pantalla. Insertar líneas es una solución pobre y, como dices, no te deja el cursor al inicio (a menos que en tu programa lleves todo el tiempo un seguimiento de dónde está el cursor). La forma de hacerlo es específica de cada sistema operativo. En Windows es una manera bastante fea y requiere varias líneas de código, pero es lo que hay. Existen bibliotecas/librerías multiplataforma, como ncurses, pero para algo tan simple, no le veo mucho sentido a usarlas. En casos así, yo siempre recurro a las APIs de cada SO, que además suelen ser más eficientes y dar menos problemas.

En cuanto a std::endl, no hay nada de malo en que la uses, salvo que estás tecleando de más sin necesidad. Es común leer que, dado que endl provoca que además de imprimir una nueva línea, se limpie el buffer (lo que ocasiona que se escriban/muestren inmediatamente los datos) es menos eficiente que '\n' (que sólo imprime una nueva línea, sin limpiar el buffer, por lo que los datos podrían no imprimirse en ese momento) pero a cambio garantiza que los datos se muestren correctamente, cuando deben. Todo eso aplica cuando estamos escribiendo a un archivo, pero cuando estamos usando la salida estándar stdout (la consola/terminal/línea de comandos), como en el caso de cout, no hay ninguna diferencia. En Linux, de forma predeterminada stdout es "line buffered", es decir, el buffer se limpia automáticamente cuando se encuentra un caracter de nueva línea, así que ambos, endl y '\n', tienen el mismo efecto. En Windows stdout ni siquiera usa buffer (por defecto) así que imprimas lo que imprimas, se mostrará tan pronto como sea posible. De nuevo, es irrelevante si usas endl o '\n'.