2010-08-11 20 views
8

Si una clase tiene un único constructor de argumentos, lo entiendo es que es implícitamente convertible por el constructor al tipo de argumento en contextos apropiados. La definición de un operador de conversión también hace que una clase sea convertible a otro tipo. Preguntasoperador de conversión sobrecargado o constructor de argumento único

  • ¿Alguna vez se llama al operador de conversión implícitamente?
  • Si se definen un solo constructor de argumento y un operador de conversión con el mismo tipo para una clase, ¿tiene uno uno sobre el otro o es ambiguo?
  • Si ha decidido que desea que una clase sea convertible a un tipo determinado, ¿qué enfoque es mejor o debería proporcionar ambos?

Editar:

veo que no entendía claramente la direccionalidad y que los dos realizan conversiones en las direcciones opuestas. Como seguimiento en

  • Si tiene control sobre dos clases que desea hacer convertibles entre sí, ¿hay una manera preferida en términos de estas dos operaciones para lograr esto?
  • ¿Es posible marcar el operador de conversión como explícito?

Respuesta

3

No, si una clase tiene un constructor único argumento es convertir implícitamente de el tipo de su argumento.

En cuanto a sus otras preguntas:

  • ¿El operador de conversión siempre consigo llamado implícitamente?

Sí, siempre que sea necesario.

  • Si se definen un solo constructor de argumento y un operador de conversión con el mismo tipo para una clase, ¿tiene uno uno sobre el otro o es ambiguo?

No estoy muy claro qué es lo que está preguntando, pero si una conversión puede ser de cualquier manera, es ambiguo.

  • Si ha decidido que desea que una clase sea convertible a un tipo determinado, ¿qué enfoque es mejor o debería proporcionar ambos?

Tienes que usar un cast - los constructores no hacen esto.

En general, si no desea conversiones automáticas de una clase a otros tipos (y generalmente no lo hace), es mejor proporcionar funciones de conversión con nombre (ToString, ToInt, ToX) que nunca se llamarán automáticamente por el compilador.

que conduce a sus otras dos preguntas:

  • Si usted tiene control sobre dos clases que desea hacer convertibles en y entre sí hay una manera preferida en términos de estas dos operaciones para llevar a cabo ¿esta?

Sí, usé una función nombrada para realizar al menos una de las conversiones. std :: string hace esto: hay una conversión de un char * a una cadena usando un constructor, pero a la inversa, debe usar la función c_str() nombrada.

  • ¿Es posible marcar el operador de conversión como explícito?

Lamentablemente, no.

7

Estos dos son opuestos: no explícita constructor de un argumento permite la conversión automática de tipos a su tipo de clase de tipo de argumento. El operador de conversión permite la conversión implícita de de a su tipo de clase.

La sabiduría común es evitar ambos, si no se requiere específicamente.

+3

+1: * avoid both * –

+2

¿Sugiere que std :: string no tenga una conversión implícita de const char *? Eso haría que la clase fuera mucho más difícil de usar. –

+1

No, no estoy diciendo eso. Pero muchas veces he visto personas que definen operadores de conversión en sus propias clases de cadenas, y luego se sorprenden de que '+' no siempre sea concatenación, sino aritmética del puntero. –

2

si tiene control sobre dos clases que desea hacer convertibles entre sí, ¿hay una manera preferida en términos de estas dos operaciones para lograr esto?

me gustaría escribir una sola discusión, explícita constructor.

He visto muchas sorpresas realmente malas al permitir conversiones implícitas, por lo que siempre las rechazo. Escribir f(A(b)) no es mucho más difícil que escribir f(b) y le da al compilador muchas más posibilidades de dar un mensaje de error significativo cuando el f() derecho no está dentro del alcance.

Cuestiones relacionadas