2010-12-08 21 views
6

Estoy revisando mi final, y no puedo entender por qué esta pregunta es lo que es.C++ clase pregunta

asumir la siguiente declaración de la clase:

class Testing { 
public: 
     Testing(int n); 
     void Show(const Testing& w, int a = 10); 
     int value; 
private: 
     int DoThis(); 
}; 

asumir las siguientes líneas de código están tratando en un programa principal(), y que x es de tipo Testing y ha sido creado propertly.

x.Show(18); legal o ilegal

La respuesta es legal, entiendo que el segundo parámetro no es necesaria debido a la = 10, pero desde 18 no es de tipo Testing no es que un parámetro no válido?

Respuesta

16

La prueba tiene un constructor no explicit que toma un int. Por lo tanto, un int puede convertirse implícitamente en Testing mediante la construcción de un objeto temporal.

Dado que Show toma un const Testing & (y no solo un Testing &), puede pasar un tiempo temporal a este. Finalmente, el segundo parámetro es opcional, por lo que no tiene que especificar un valor para eso.

Todo este mecanismo es lo que le hace esto, por cierto:

void f(const std::string &str); 
// ... 
f("Hello"); 

Aquí, "Hello" es de tipo const char (&)[6], el cual decae a un const char *, pero se puede construir un std::string de un const char *, por lo tanto permitiendo el uso de un const char * donde se necesita un parámetro std::string.

Tenga en cuenta que esto construye un temporal, y por lo tanto solo es válido para los parámetros que se pasan por valor o por referencia de referencia (fallará para las referencias). Además, el constructor no debe marcarse como explicit.

+0

Gracias, hubo algunas buenas respuestas, pero esto es muy completo. Gracias por tomarse el tiempo para darme una explicación. – dubyaa

+0

El tipo de '" Hola "' es 'const char (&) [6]', que se descompone en 'const char *'. –

3

El constructor aquí:

Testing(int n); 

proporciona una conversión implícita de int a Testing, y esto entonces coincide con el prototipo para Show, con el primer parámetro de ser un ejemplo Testing construido a partir de la int 18, y el segundo parámetro es el valor por defecto 10.

Si no permite la conversión implícita de esta manera:

explicit Testing(int n); 

el código no se compilará.

5

Como Testing tiene un constructor que acepta int, ese c-tor se usa para construir automáticamente un objeto Testing para el primer parámetro. El código realidad termina algo de trabajo como:

x.Show(Testing(18)); 
6

Hay una noción de conversión automática en C++, llamados implicit conversion sequences. Como máximo, una conversión en dicha secuencia puede ser una definida por el usuario, y llamar a un constructor para un objeto temporal es una conversión definida por el usuario.Está bien crear un temporal aquí ya que se vinculará a la referencia de const, y se destruirá cuando se complete la llamada Show().