int main() {
int theInt = 5;
/**
* Constructor "Example(int val)" in effect at the statement below.
* Same as "Example exObject(theInt);" or "Example exObject = Example(theInt);"
*/
Example exObject = theInt; // 1
Example ctr(5);
/**
* "operator unsigned int()" in effect at the statement below.
* What gets assigned is the value returned by "operator unsigned int()".
*/
int theInt1 = ctr; // 2
return 0;
}
À l'instruction 1, le constructeur Example(int val)
est appelé. Déclarez le comme explicit Example(int val)
et vous obtiendrez une erreur de temps de compilation, c'est-à-dire qu'aucune conversion implicite ne sera autorisée pour ce constructeur.
Tous les constructeurs à un seul argument sont appelés implicitement si la valeur affectée est de leur type d'argument respectif. L'utilisation du mot clé explicit
avant les constructeurs à un seul argument désactive l'appel du constructeur implicite et donc la conversion implicite.
Si le constructeur a été déclaré comme explicite, c'est-à-dire explicit Example(int val)
, alors ce qui suit arriverait pour chaque instruction.
Example exObject(theInt); // Compile time error.
Example exObject = theInt; // Compile time error.
Example exObject(Example(theInt)); // Okay!
Example exObject = Example(theInt); // Okay!
Notez également qu'en cas d'appel du constructeur implicite et donc la conversion implicite la valeur attribuée est une rvalue à savoirun objet non nommé implicitement créé à l'aide d'un lvalue (Theint) qui nous dit qu'en cas de conversion implicite le compilateur convertit
Example exObject = theInt;
à
Example exObject = Example(theInt);
donc (en C de 11) n » Attendez-vous à ce que le constructeur de lvalue soit appelé vu que vous utilisez une valeur lvalue, c'est-à-dire une valeur nommée theInt
pour l'affectation. Ce qui s'appelle est le constructeur rvalue puisque la valeur assignée est en fait l'objet non nommé créé en utilisant le lvalue. Cependant, ceci s'applique si vous avez à la fois des versions lvalue et rvalue du constructeur. Sur l'instruction 2, operator unsigned int()
est appelée. Il suffit de le considérer comme un appel de fonction normal avec un nom bizarre et le fait qu'il peut être appelé automagiquement lorsqu'une conversion implicite se produit. La valeur renvoyée par cette fonction est la valeur affectée dans l'expression. Et puisque dans votre implémentation, la valeur renvoyée est un entier correctement affecté à int theInt1
.
Pour être précis operator unsigned int()
surcharges ()
opérateur qui est l'opérateur de moulage. Dans votre cas, il est surchargé pour int
donc chaque fois qu'un objet de la classe Example
est affecté à un int
, la transtypage de type implicite de Example
à int
a lieu et operator unsigned int()
est appelée. Par conséquent,
int theInt1 = ctr;
est équivalent à
int theInt1 = (int)ctr;
@Zuzu: Je remarque que vous avez 'using namespace std;' vers le haut du fichier. Je suppose que votre conférencier ou le matériel d'enseignement l'a comme ça. Vous n'arrivez pas à en avoir besoin dans cet exemple, mais soyez prudent lorsque vous l'utilisez. ** Jamais ** jamais l'utiliser dans un fichier d'en-tête - cela peut causer un chagrin incalculable si vous voulez utiliser vous-même des noms qui se trouvent dans l'espace de noms 'std'. Envisagez de ne jamais l'utiliser du tout, mais si vous êtes comme moi, vous pouvez l'utiliser uniquement dans les modules (fichiers .cpp) et après tout #includes, mais avant les définitions de fonction et de méthode. – quamrana
Quelle est votre question? –