Il codice che hai riportato ha un problema (e difatti il compilatore se ne accorge e ti segnala un errore): il costruttore che riceve un "int" richiama il costruttore che riceve una "String", e viceversa.
E' una situazione ricorsiva, che se eseguita porterebbe ad un loop (A chiama B, che chiama A, che chiama B, ecc.). Una soluzione migliore è:

codice:
       class persone
       {
         // Proprietà
         public int annodinascita;
         public String Cognome=new String();

         // Costruttori
         public persone(int annonascita)
         {
           this(annonascita, "Non Conosco");
         }

         public persone(String Cognome)
         {
           this(0, Cognome);
         }

         public persone(int annonascita , String Cognome)
         {
           annodinascita = annonascita;                  
           this.Cognome = Cognome;                       
         }                                               
                                                         
         // Metodo che calcola l'età del soggetto        
         public int calcolaeta (int annoattuale)         
         {                                               
           return (annoattuale - annodinascita);         
         }                                               
       }
in cui entrambi i costruttori fanno riferimento a quello che riceve entrambi i parametri.

Come dici tu, scopo primario dei costruttori è dare un valore di "default" alle variabili di un oggetto appena creato.

Per risponderti:
1) ai costruttori devi passare il valore della variabile che vuoi utilizzare per l'inizializzazione che, all'interno del codice, sarà utilizzabile tramite l'identificatore che hai dichiarato (nel tuo caso "annonascita" e "Cognome")

2) il codice che ti ho postato dovrebbe risponderti da solo: l'inizializzazione avviene nel costruttore "int, String"