2013-06-05 1 views
3

J'ai une question liée à l'implémentation de l'opérateur = en C++. Si je me souviens bien, il y a deux façons de mettre en œuvre = dans une classe: on est à la surcharge = explicitement, et par exemple:où dois-je implémenter l'opérateur = en C++

class ABC 
{ 
    public: 
     int a; 
     int b; 
     ABC& operator = (const ABC &other) 
     { 
      this->a = other.a; 
      this->b = other.b; 
     } 
} 

et l'autre est de définir = implicitement. Par exemple:

class ABC 
    { 
     public: 
      int a; 
      int b; 
      ABC(const ABC &other) 
      { 
      a = other.a; 
      b = other.b; 
      } 
    } 

Ma question est la suivante:

1) Est-il nécessaire de mettre en œuvre = explicitement et implicitement? 2) Si un seul d'entre eux est nécessaire, quelle implémentation est préférée?

Merci!

+3

Ce sont deux choses différentes. Le premier exemple a un opérateur d'affectation. Le second, un constructeur de copie. Cela ne fait aucune différence car les versions générées par le compilateur sont assez bonnes. – juanchopanza

+5

Vous voudrez peut-être lire sur [la règle de trois] (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29). –

Répondre

3

Si vous voulez personnaliser l'affectation/copie, vous devez mettre en œuvre à la fois:

  • operator= est utilisé pour des missions, par exemple: ABC a; ABC b; a = b;
  • ABC::ABC(const ABC &other) est utilisé pour des copies, par exemple: ABC a; ABC b(a);.

Il est également très probable que vous souhaitiez implémenter un constructeur par défaut et un destructeur aussi. Vous pouvez en lire plus sur le rule of three.

+3

En fait, vous n'avez pas besoin de l'implémenter dans ce cas. – juanchopanza

+1

En supposant que OP souhaite le personnaliser au-delà de l'implémentation triviale. – slaphappy

+0

Et après avoir lu sur la règle de trois, lire sur [la règle de cinq] (http://stackoverflow.com/questions/4782757/rule-of-three-becomes-rule-of-five-with-c11) . –

1

Dans votre cas, vous n'avez pas besoin d'implémenter de construction de copie ni d'affectation de copie, puisque le compilateur générera automatiquement ces fonctions membres pour vous. Les fonctions générées appellent simplement le constructeur de copie ou l'opérateur d'assignation de copie respectivement pour chaque membre de données.

Vous avez seulement besoin d'implémenter des fonctions, si vous voulez avoir un comportement personnalisé. En passant, si vous implémentez le constructeur de copie, alors l'opérateur d'assignation de copie aura toujours le même comportement par défaut que décrit ci-dessus et vice versa. Par conséquent, si vous personnalisez l'un des deux, vous devrez probablement personnaliser l'autre. Et peut-être aussi le destructeur. C'est ce qu'on appelle le rule of three. Dans la plupart des cas, le comportement par défaut sera parfait.

4

La première chose que vous montrez est l'opérateur d'affectation et le second est le constructeur de copie . Ce sont des fonctions distinctes qui font des choses différentes. (à savoir le ctor met en place un objet qui est en train de naître et op = change l'état d'un objet existant pour correspondre à celui d'un autre.)

Avec un peu de chance (aidé par le design) vous ne mettez en œuvre aucun d'eux mais laissez à la langue pour les créer. Si vous utilisez des membres raisonnables et des classes de base, cela arrivera.

Si vous avez besoin d'aller les mettre en œuvre (vérification deux fois il est vraiment le cas!), Vous aurez probablement besoin des deux, voir Rule of 3