Affectation

L’opérateur d’affectation (=) est, strictement parlant, un opérateur binaire. Sa déclaration est identique à celle de tout autre opérateur binaire, avec les exceptions suivantes :

  • Il doit s'agir d'une fonction membre non statique. Aucun opérateur= ne peut être déclaré en tant que fonction nonmember.
  • Il n'est pas hérité par les classes dérivées.
  • Une fonction par défaut = peut être générée par le compilateur pour les types de classes, si aucune n’existe.

L'exemple suivant montre comment déclarer un opérateur d'assignation :

class Point
{
public:
    int _x, _y;

    // Right side of copy assignment is the argument.
    Point& operator=(const Point&);
};

// Define copy assignment operator.
Point& Point::operator=(const Point& otherPoint)
{
    _x = otherPoint._x;
    _y = otherPoint._y;

    // Assignment operator returns left side of assignment.
    return *this;
}

int main()
{
    Point pt1, pt2;
    pt1 = pt2;
}

L’argument fourni est le côté droit de l’expression. L'opérateur retourne l'objet pour conserver le comportement de l'opérateur d'assignation, qui retourne la valeur du côté gauche une fois l'assignation terminée. Cela permet de chaîner des affectations, telles que :

pt1 = pt2 = pt3;

L’opérateur d’affectation de copie ne doit pas être confondu avec le constructeur de copie. Ce dernier est appelé lors de la construction d’un nouvel objet à partir d’un objet existant :

// Copy constructor is called--not overloaded copy assignment operator!
Point pt3 = pt1;

// The previous initialization is similar to the following:
Point pt4(pt1); // Copy constructor call.

Remarque

Il est conseillé de suivre la règle de trois qu’une classe qui définit un opérateur d’affectation de copie doit également définir explicitement le constructeur de copie, le destructeur et, à compter de C++11, le constructeur de déplacement et l’opérateur d’affectation de déplacement.

Voir aussi