Più che alla printf (un pò scomoda in C++, ma perfettamente usabile) mi riferivo al typedef e ai char*. Come nome del typedef avevi scelto proprio quello che va in collisione con la std::string (quando si esplicita il namespace) e questo ti avrebbe causato problemi più avanti.
In C++ è comunque preferibile usare std::string rispetto alle stringhe C e limitare l'uso di queste ultime solo per interfacciarsi con codice C esistente, API del sistema operativo o codice legacy.

Se non hai già un testo di riferimento, ti consiglio Thinking in C++ di Bruce Eckel ( scaricabile liberamente dal suo sito e in altri.)
posso implementare il costruttore della classe fuori dalla sua dichiarazione, vero?
Certamente. Attento però che i prototipi devono essere uguali. (Nel codice ripostato sono diversi).

Per quanto possibile sarebbe meglio fossero:
const Tipo&
quindi nel tuo caso
const std::string&
(Risparmi un costruttore di copia, può ricevere stringhe costanti letterali, etc)
volevo sapere se posso partire con dei valori costanti già prefissati che fanno parte della classe, ad esempio come potrebbe essere la versione della classe stessa
Con il prossimo standard ( e i compilatori che lo supportano, ormai alle porte) sarà possibile scrivere:
codice:
private:
	string version="ver. 1.0,0";
}
Con l'attuale no, si può solo inizializzare il valore tramite il costruttore o usando una funzione apposita.