Conclusioni
Per terminare questo argomento restano da citare gli operatori per la conversione
di tipo e analizzare la differenza tra operatori come funzioni globali o come
funzioni membro.
Per quanto riguarda la conversione di tipo, si rimanda all'appendice A.
Solitamente non c'e` differenza tra un operatore definito globalmente e uno
analogo definito come funzione membro, nel primo caso per ovvi motivi l'operatore
viene solitamente dichiarato friend delle classi cui appartengono
i suoi argomenti; nel caso di una funzione membro, il primo argomento e` sempre
una istanza della classe e l'operatore puo` accedere a tutti i suoi membri,
per quanto riguarda l'eventuale secondo argomento puo` essere necessaria dichiararlo
friend nell'altra classe. Per il resto non ci sono differenze per
il compilatore, nessuno dei due metodi e` piu` efficiente dell'altro; tuttavia
non sempre e` possibile utilizzare una funzione membro, ad esempio se si vuole
permettere il flusso su stream della propria classe , e` necessario ricorrere
ad una funzione globale, perche` il primo argomento non e` una istanza della
classe:
class Complex {
public:
/* ... */
private:
float Re, Im;
friend ostream& operator<<(ostream& os,
Complex& C);
};
ostream& operator<<(ostream& os, Complex& C) {
os << C.Re << " + i" << C.Im;
return os;
}
Adesso e` possibile scrivere
Complex C(1.0, 2.3);
cout << C;
|