2010-08-11 7 views
8

Si une classe a un constructeur à un seul argument, je crois savoir qu'elle est implicitement convertible par le constructeur au type de l'argument dans les contextes appropriés. La définition d'un opérateur de conversion rend également une classe convertible en un autre type. Questionsopérateur de conversion surchargé ou constructeur à un seul argument

  • L'opérateur de conversion est-il jamais appelé implicitement?
  • Si un constructeur à un seul argument et un opérateur de conversion du même type sont définis pour une classe, est-ce que l'un a préséance sur l'autre ou est-il ambigu?
  • Si vous avez décidé que vous souhaitez convertir une classe en un type donné, quelle approche est la meilleure ou devez-vous fournir les deux?

Edit:

Je vois que je ne comprenais pas clairement la directionnalité et que les deux effectuer des conversions dans des directions opposées. Par la suite

  • Si vous avez le contrôle sur deux classes que vous souhaitez rendre convertibles entre elles, existe-t-il un moyen privilégié pour ces deux opérations?
  • Est-il possible de marquer l'opérateur de conversion comme explicite?

Répondre

3

Non, si une classe a un constructeur unique argument est implicitement convertible de le type de son argument.

Quant à vos autres questions:

  • L'opérateur coulé jamais obtenir appelé implicitement?

Oui, chaque fois que nécessaire.

  • Si les deux un constructeur unique argument et l'opérateur coulé avec le même type sont définis pour une classe on n'a préséance sur l'autre ou est-il ambigu?

Je ne sais pas trop ce que vous demandez, mais si une conversion peut aller dans un sens ou dans l'autre, elle est ambiguë.

  • Si vous avez décidé que vous souhaitez convertir une classe en un type donné, quelle approche est la meilleure ou devez-vous fournir les deux?

Vous devez utiliser un cast - les constructeurs ne le font pas. En général, si vous ne voulez pas que les conversions automatiques d'une classe à d'autres types (et la plupart du temps vous ne le faites pas), il est préférable de fournir des fonctions de conversion nommées (ToString, ToInt, ToX) qui ne seront jamais appelées automatiquement par le compilateur.

qui conduit à vos deux autres questions:

  • Si vous avez le contrôle sur deux classes que vous souhaitez faire convertibles en provenance et à l'autre est-il un moyen privilégié en termes de ces deux opérations à accomplir ce?

Oui, utilisé une fonction nommée pour effectuer au moins l'une des conversions. std :: string le fait - il y a une conversion d'un char * vers une chaîne utilisant un constructeur, mais dans l'autre sens, vous devez utiliser la fonction nommée c_str().

  • Est-il possible de marquer l'opérateur de conversion comme explicite?

Malheureusement, non.

7

Ces deux sont opposés: non explicite constructeur un argument permet de conversion automatique de typeà votre type de classe de type d'argument. L'opérateur de conversion permet la diffusion implicite de votre type de classe.

La sagesse commune est d'éviter les deux si ce n'est pas spécifiquement nécessaire.

+3

+1: * éviter les deux * –

+2

Suggérez-vous que std :: string ne devrait pas avoir une conversion implicite de const char *? Cela rendrait la classe beaucoup plus difficile à utiliser. –

+1

Non, je ne dis pas ça. Mais j'ai vu plusieurs fois des gens définir des opérateurs de conversion sur leurs propres classes de chaînes, puis être surpris que '+ 'ne soit pas toujours une concaténation, mais une arithmétique de pointeur. –

2

Si vous avez le contrôle sur deux classes que vous voulez rendre convertibles entre elles, existe-t-il un moyen privilégié pour ces deux opérations?

j'écrire un argument, constructeur explicite.

J'ai vu trop de mauvaises surprises en autorisant les conversions implicites, donc je les rejette toujours. Écrire f(A(b)) n'est pas beaucoup plus difficile que d'écrire f(b) et donne au compilateur beaucoup plus de chance de donner un message d'erreur significatif lorsque le droit f() n'est pas dans la portée.

Questions connexes