2010-10-24 22 views
7

Supongamos que tengo una claseconstructor con un parámetro de forma predeterminada

class C { 
     C(int a=10); 
}; 

por eso si llamo

C c; 

el contructor C(int =10) se llama y si llamo

C c(); 

el constructor por defecto ¿se llama? ¿Cómo evitar esto? Quiero ejecutar solo mi constructor, traté de hacer el constructor predeterminado privado, pero no funciona.

+3

¿Qué tal si nos proporciona un código compilable que nos muestre el comportamiento que cree que está viendo? Como puede ver en las respuestas hasta ahora, lo que usted describe no es lo que el código debería hacer. – sbi

+0

Al igual que un FYI, MSVC (al menos desde VS2003) proporcionará una advertencia sobre este problema: 'advertencia C4930: 'C c (void)': función de prototipo no llamada (¿se pretendía una definición de variable?)' Conozco otros compiladores también lo hará, pero los que tengo fácilmente disponibles en este momento no lo hacen. –

Respuesta

17
  1. En realidad, C c(); debe analizarse como una declaración de la función . Para invocar explícitamente el constructor predeterminado, debe escribir C c = C();.
  2. Una vez que defina cualquier constructor, el compilador no proporcionará un constructor por defecto para su tipo, por lo que no se podría llamar a ninguno.
  3. Como su constructor puede invocarse con un argumento, sirve como una función de conversión implícita. Debería considerar convertirlo en explicit, para evitar que las conversiones implícitas se activen en momentos inesperados.
+0

@Greg: ¡Gracias, no estoy seguro de cómo logré hacer eso! ':)' – sbi

14

El código C c(); no hace lo que usted cree:

Se declara una función llamada c que no tiene argumentos y devuelve un C. Es equivalente a

C c(void); 
+0

Lo importante es que no hace nada (en términos de comportamiento en el tiempo de ejecución). –

1

Esto se debe a la c() se interpreta como una función llamada c. C() activará el constructor apropiado para la clase C

Cuestiones relacionadas