4 votes

Pourquoi cette conversion ?

#include<iostream>

using namespace std;

class test
{
  int a, b;
public:

  test() {
    a=4; b=5;
  }

  test(int i,int j=0) {
    a=i; b=j;
  }

  test operator +(test c) {
     test temp;
     temp.a=a+c.a;
     temp.b=b+c.b;
     return temp;
  }

  void print() {
    cout << a << b;
  }
};

int main() {
  test t1, t2(2,3), t3;
  t3 = t1+2;
  t3.print();
  return 0;
}

Comment le compilateur peut-il accepter une déclaration comme t3=t1+2; donde 2 n'est pas un objet ?

7voto

tenfour Points 16759

Le compilateur voit que vous invoquez operator+(test) et tente de convertir implicitement le 2 à un test en utilisant avec succès votre test(int i,int j=0) constructeur.

Si vous voulez rendre la conversion explicite, vous devez changer le constructeur en explicit test(int i, int j=0) . Dans ce cas, votre code générerait une erreur de compilation car 2 ne peut pas être implicitement converti en test . Vous devez changer l'expression en t1 + test(2) .

2voto

Lindydancer Points 13353

Parce que test(int i,int j=0) est un constructeur qui prend un ou deux arguments, ainsi un test est créé à partir de 2 . Dans l'étape suivante test operator +(test c) s'appelle.

2voto

Kerrek SB Points 194696

Il y a un binaire operator+ disponible qui prend deux opérandes de type test . De plus, test est implicitement constructible à partir de int via le constructeur test(int, int = 0) . En mettant les deux ensemble, t1 + 2 devient t1 + test(2, 0) .

Pour empêcher cette conversion silencieuse (qui peut parfois causer des problèmes de sécurité), il est nécessaire d'avoir recours à la procédure de conversion. très surprenantes chaînes de conversion), déclarez vos constructeurs qui acceptent un seul argument comme explicites : explicit test(int, int = 0) .

1voto

Matthieu M. Points 101624

Parce que test(int i, int j = 0) n'est pas marqué explicitement.

Par conséquent, t1 + 2 est interprété comme t1.operator+(2) qui est lui-même interprété comme t1.operator+(test(2)) (conversion implicite).

Si vous marquez le constructeur comme explicit une erreur se produira (pendant la compilation), indiquant que 2 ne peut être converti en un test ou que le operator+ ne correspond pas.

0voto

Ernest Friedman-Hill Points 56605

En bref, parce que le C++ comprend surcharge des opérateurs la possibilité de définir des implémentations personnalisées des opérateurs pour les types définis par l'utilisateur. Le site operator+() illustrée ci-dessus est la façon dont vous définissez la fonction + pour le type test . Lorsque le compilateur voit une expression dans laquelle + est appliqué à un test il recherche un objet operator+ défini dans test (ou une forme à deux arguments définie comme une fonction globale avec un premier argument de type test o test& .) Il invoque ensuite la fonction, éventuellement après avoir converti l'autre argument.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X