Je veux m'assurer que je comprends bien la valeur de passage par rapport à la référence de passage. En particulier, je regarde les versions de préfixe/postfix de l'opérateur d'incrément ++
pour un objet.Opérateurs d'incrémentation préfixes/postfixes
Supposons que nous avons la classe X
suivante:
class X{
private:
int i;
public:
X(){i=0;}
X& operator ++(){ ++i; return *this; } //prefix increment
X operator ++ (int unused){ //postfix increment
X ret(*this);
i++;
return ret;
}
operator int(){ return i; } //int cast
};
D'abord, ai-je mis en œuvre le préfixe/opérateurs d'incrément postfix correctement?
Deuxièmement, comment l'opérateur postfix est-il efficace en mémoire, comparé à l'opérateur de préfixe? Plus précisément, combien de copies d'objet X
sont créées lorsque chaque version de l'opérateur est utilisée?
Une explication de ce qui se passe exactement avec le retour par référence et le retour par valeur pourrait m'aider à comprendre.
Edit: Par exemple, le code suivant ...
X a;
X b=a++;
... sont a et b maintenant des alias?
Il n'est pas nécessaire de post-incrémenter 'i' dans l'opérateur postfix. En fait, je ferais comme [FredOverflow suggère] (http://stackoverflow.com/questions/3181211/3181359#3181359) et appelez la version de préfixe. OMI est en effet plus idiomatique que de ré-implémenter l'incrément (même si la mise en œuvre est triviale ici). Et débarrassez-vous de cet opérateur de conversion implicite. Cela va vous faire du mal autrement. (La troisième et dernière fois que j'ai écrit un opérateur de conversion implicite était en 2001 et un ou deux ans plus tard, j'ai découvert qu'il causait des bugs subtils et l'a supprimé - comme tous les précédents.) – sbi