Cuando creamos una variable así:
Persona p = Persona();
Lo que hace el compilador es que aparta un espacio de memoria del tamaño necesario para almacenar una estructura que contenga un nombre y una edad.
A ese espacio le llamamos “p”, y de hecho como ahí aún no le ponemos valores, están vacíos en la memoria.
Cuando creamos una variable así:
Persona *p = new Persona();
Lo que hacemos antes del “=”, es NO reservar un espacio de memoria para almacenar una persona, simplemente creamos una variable “p” que puede almacenar una dirección de memoria, y le decimos que almacenará de hecho una dirección que apuntará a una persona más adelante.
Luego, cuando llega al “new Persona()”, que de hecho ese ya se ejecuta cuando ejecutamos el programa, no cuando compilamos, lo que pasará es que ahí si, apartará en memoria un espacio suficiente para almacenar una persona, obtendrá su puntero, y ese puntero será el que almacenará en p.
Por lo tanto no son exactamente iguales, aunque para fines prácticos puedan ser equivalentes, internamente C++ los maneja distinto, y podemos utilizar uno u otro según lo que necesitemos más adelante.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?