Ottimizzare C++/Ottimizzazione del codice C++/Costruzioni e distruzioni: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
m Bot: sostituisce source con syntaxhighlight |
||
Riga 47:
Viene mostrata dal seguente codice, nel quale <code>C</code> rappresenta il nome della classe, e <code>swap</code> una funzione membro che dovrà essere definita:
<
C& C::operator=(C new_value) {
swap(new_value);
return *this;
}
</syntaxhighlight>
=== Overload per evitare conversioni ===
Riga 60:
Supponiamo di aver scritto la seguente funzione:
<
int f(const std::string& s) { return s[0]; }
</syntaxhighlight>
il cui scopo è consentire di scrivere il segueente codice:
<
std::string s("abc");
int n = f(s);
</syntaxhighlight>
Tale funzione può però essere usata anche dal seguente codice:
<
int n = f(string("abc"));
</syntaxhighlight>
E, grazie alla conversione implicita da <code>char*</code> a <code>std::string</code>, può essere usata anche dal seguente codice:
<
int n = f("abc");
</syntaxhighlight>
Entrambe le due ultime chiamate alla funzione <code>f</code> sono inefficienti, perché creano un oggetto temporaneo <code>std::string</code> non vuoto.
Riga 87:
Per mantenere l'efficienza della prima chiamata dell'esempio, si dovrebbe definire anche la seguente funzione in overload:
<
int f(const char* s) { return s[0]; }
</syntaxhighlight>
In generale, se una funzione è chiamata passandole un argomento di un tipo non consentito ma che può venire implicitamente convertito a un tipo consentito, viene creato un oggetto temporaneo del tipo consentito.
|