Constructeur de conversion vs opérateur de conversion : priorité
En C, les constructeurs de conversion et les opérateurs de conversion fournissent des moyens de convertir des objets entre différents types. Lorsque les deux sont disponibles pour une conversion donnée, il est crucial de comprendre leur priorité pour déterminer lequel sera appelé.
Établissement de la priorité
La priorité entre les constructeurs de conversion et les opérateurs de conversion est défini par le standard C (13.3.1.4) :
La résolution de surcharge est utilisée pour sélectionner la conversion définie par l'utilisateur à effectuer invoqué. Les fonctions candidates sont sélectionnées comme suit :
- Les constructeurs de conversion (12.3.1) du type de destination sont des fonctions candidates.
- Les fonctions de conversion du type source et ses classes de base qui donnent un Le type compatible avec le type de destination sont des fonctions candidates.
Remplacement de l'opérateur Constructeur
Dans l'exemple de code fourni, où un constructeur de conversion et un opérateur de conversion sont définis pour la classe A en B, l'opérateur de conversion a la priorité :
class A; class B { public: B(){} B(const A&) //conversion constructor { cout << "called B's conversion constructor" << endl; } }; class A { public: operator B() //conversion operator { cout << "called A's conversion operator" << endl; return B(); } };
Ceci est car, lors de la liaison des paramètres de référence (ici, le paramètre d'objet implicite de la fonction de conversion), la référence non const dans la fonction de conversion (A&) a priorité sur la référence const dans le constructeur de conversion (const A&).
Considérations philosophiques orientées objet
Concernant la question philosophique de savoir quelle classe devrait être responsable de la conversion d'un objet, le standard se range du côté de la source classe (A dans ce cas). Cela correspond au principe de l'encapsulation, car cela permet à la classe source de contrôler le processus de conversion et de garantir l'exactitude de l'objet résultant (B).
C'est en fin de compte à la discrétion du développeur de déterminer le mécanisme de conversion approprié. pour un scénario spécifique, en tenant compte de facteurs tels que l'encapsulation, l'abstraction et la lisibilité du code.
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!