Esempio banale. Invece che:

codice:
Oggetto funzione() { ... }
...
Oggetto o = funzione();
Fai:

codice:
void funzione( Oggetto& ) { ... }
...
Oggetto o;
funzione( o );
O in modo piu` esplicito tramite un puntatore, altrimenti non ti rendi conto, guardando la chiamata, di quando un parametro venga passato per riferimento, essendo la sintassi identica al passaggio per valore:

codice:
void funzione( Oggetto* ) { ... }
...
Oggetto o;
funzione( &o ); // il '&' evidenzia una potenziale modifica del parametro attuale
E per parametri non destinati ad essere modificati fai sempre:

codice:
void funzione( const Oggetto& ) { ... }
I tipi primitivi invece passali sempre per valore. Questo ovviamente quando non si richiede side-effect.