codice:
#ifndef PERSONA_H
#define PERSONA_H

#include <iostream>
// using namespace std; <-- *mai* istruzioni using negli header

class Persona
{
    istream& operator >> (istream& in, Persona& P);
    ostream& operator << (ostream& out, const Persona& P);

public:
    Persona();
    Persona(const Persona & );
    Persona(const std::string & Nome, const std::string & Cognome, int Eta); // non ha senso dichiarare un parametro non-puntatore e non-reference come const
    
    // I getter si possono tranquillamente lasciare inline
    const std::string & GetNome() const { return nome; };
    const std::string & GetCognome() const { return cognome; };
    const int GetEta() const {return eta; };
    
    ~Persona();

private:
    std::string nome;
    std::string cognome;
    int eta;
};

#endif
codice:
#include <iostream>
#include <stdexcept>

#include "Persona.h"

using namespace std;

// in effetti è inutile, basterebbe quello di default
// qui uso la sintassi dell'initializer list per costruire i campi direttamente
// con i valori desiderati, invece di farli costruire con il costruttore di default
// e poi fare assegnamenti nel corpo della funzione
Persona::Persona(const Persona & Right)
    : nome(Right.GetNome()),
    cognome(Right.GetCognome()),
    eta(Right.GetEta())
{

}

Persona::Persona()
    : eta(0)
{
}

Persona(const std::string & Nome, const std::string & Cognome, int Eta)
    : nome(Nome),
    cognome(Cognome),
    eta(Eta)
{
    if(Eta<0)
        throw std::invalid_argument("Eta deve essere positivo.");
}

Persona::~Persona()
{
    // inutile
}

ostream& operator << (ostream& out, const Persona& P)
{
    out << P.Nome << " " << P.Cognome << " " << P.Eta << " anni" << endl;
    return out;
}

istream& operator >> (istream& in, Persona& P)
{
    cout << "Inserire Nome: ";
    getline(in, P.nome);
    cout << "Inserire Cognome: ";
    getline(in, P.cognome);
    cout << "Inserire età: ";
    in >> P.Eta;
    return in;
}
Nota che nell'operatore di input c'è ancora un problema, a te individuarlo.