Se non l'hai definito, verrà usato un construttore di copia implicito che fa la copia bit a bit, e spesso non è esattamente ciò che serve. Infatti se hai puntatori come membri rischi casini

eh gia! era proprio il caso che mi ero immaginato! un oggetto con puntatori dentro e l'inaccettabile behaviour che avrebbe fatto si che il parametro attuale scrivesse la memoria dell'oggetto passato come parametro per valore :P (ovviamente se non definisci il costruttore di copia te la vai a cercare

)
In una funzione, non passare un oggetto per valore, ma per const reference:
void f(const Fred& object);
Si! si! era solo per curiosità :P
è un ottimo metodo passare il riferimento const... ci guadagni in velocità e in memoria (rispetto alla creazione delle copie locali).
Ad occhio e croce che ne pensate se dico che il reference è ottimizzato anche rispetto ai puntatori??? (solo in ottica maniacale)
anche perchè quando passi un puntatore viene comunque creata una copia locale e poi per effettuare un accesso all'area di memoria devi dereferenziare esplicitamente il puntatore...
Comunque questa è solo un ottica maniacale che differisce dai miei gusti... potete dirmi di tutto ma non riesco a non stravedere per i puntatori

ciao
Gio