Penso che la tua classe in quella maniera viola il principio di singola responsabilità (vuole contemporaneamente rappresentare una persona e gestire la memoria delle stringhe), non è exception-safe (se la seconda new fallisce viene sollevata una std::bac_alloc, ma la memoria associata a P.Nome non viene liberata), ha una certa dose di codice duplicato, gestisce la memoria in maniera poco efficiente (continui ad allocare/deallocare roba) e il continuo intervallarsi di codice per gestire la memoria delle stringhe e codice della classe vero e proprio rende la lettura e la verifica del codice difficoltosa.
Se vuoi imparare davvero, scriviti una classe stringa per bene, e poi usala all'interno di questa tua classe Persona, in modo da separare i due compiti; naturalmente nei progetti veri in genere userai la classe string della libreria standard, che sicuramente è più collaudata della tua.

Rispondi quotando