Maison > Article > développement back-end > Quelles sont les méthodes de surcharge d’opérateurs en C++ ?
Quels sont les moyens de surcharger les opérateurs en C++ ?
Il existe deux façons de surcharger les opérateurs :
1. symbol devient une fonction membre de cette classe. Cela permet aux fonctions d'opérateur d'accéder aux membres privés de la classe. Il permet également aux fonctions d'utiliser le paramètre implicite this pointer pour accéder à l'objet appelant.
2. Faites de la fonction membre surchargée une fonction indépendante. Lorsqu'elle est surchargée de cette manière, la fonction opérateur doit être déclarée amie de la classe afin d'accéder aux membres privés de la classe.
Certains opérateurs, tels que l'opérateur d'entrée de flux >> et l'opérateur de sortie de flux <<, doivent être surchargés en tant que fonctions indépendantes. D'autres opérateurs peuvent être surchargés soit en tant que fonctions membres, soit en tant que fonctions autonomes.
Supposons que le code de fonction surchargé indépendant suivant ait été écrit :
Length a(4, 2), b(1, 8), c (0); c = a + b;
Ce code sera interprété par le compilateur sous la forme suivante :
Length a(4, 2), b(1, 8), c(0); c = operator+(a, b);
Le compilateur permet au programmeur pour utiliser le curseur intermédiaire. Cependant, il traite l'opérateur comme une fonction ordinaire, dont le nom est Operator+, ce qui n'a pas une signification si évidente. Par exemple, considérons l'instruction suivante :
c = 2 + a;
est équivalente à l'instruction suivante :
c = operator+(2, b);
Les deux instructions se compilent et s'exécutent correctement grâce au constructeur de conversion de la classe Longueur. Un objet Longueur peut être créé à partir du paramètre entier 2.
Les opérateurs arithmétiques et relationnels peuvent être surchargés aussi facilement que les fonctions membres. Les méthodes de surcharge de l'opérateur d'addition sont les suivantes. Tout d'abord, modifiez la déclaration en classe pour que l'opérateur devienne une fonction membre :
class Length { private: int len_inches; public: //修改operator+的声明 Length operator+(Length b); //类的其余部分,省略 };
Notez que l'opérateur est désormais déclaré comme un opérateur unique de type Longueur car en tant que fonction membre, l'opérateur est a automatiquement transmis un objet Longueur via le paramètre implicite this. Par exemple, si vous écrivez l'instruction suivante :
Length a(4, 2), b(1, 8), c(0); c = a + b;
alors le compilateur traitera cette instruction comme quelque chose de la forme :
Length a(4, 2), b(1, 8), c (0); c = a.operator+ (b);
Lors de l'écriture de a + b, l'opération + surchargée L'opérande gauche de l'opérateur devient l'objet permettant d'appeler la fonction membre et l'opérande droit devient un paramètre explicite. Parallèlement à ces changements, le corps de l'opérateur s'écrit sous la forme d'une instruction de la forme :
Length Length::operator+(Length b) { return Length(this->len_inches + b.len_inches); }
En résumé, l'opérateur d'addition (ainsi que d'autres opérateurs arithmétiques et relationnels) peut être utilisé comme un fonction membre, peut également être surchargée en tant que fonction indépendante.
En général, il est préférable de surcharger les opérateurs binaires en tant que fonctions indépendantes qui prennent le même type de paramètres formels. En effet, contrairement à la surcharge des opérateurs autonomes, la surcharge des fonctions membres crée une distinction artificielle entre les deux paramètres en rendant le paramètre de gauche implicite, ce qui permettra au constructeur de conversion d'appliquer le paramètre de droite, mais le paramètre de gauche ne l'est pas. utilisé, ce qui entraîne une situation dans laquelle l'ordre des paramètres formels est modifié, entraînant une erreur du compilateur dans le programme correct s'il est modifié. Les exemples sont les suivants :
Length a(4, 2), c(0); c = a + 2; //编译,当于 c = a.operator+ (2) c = 2 + a; //不能编译:相当于 c = 2 .operator+ (a);
Tutoriel recommandé : "c++"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!