En los lenguajes de programación de computadoras , el término constructor predeterminado puede referirse a un constructor que es generado automáticamente por el compilador en ausencia de constructores definidos por el programador (por ejemplo, en Java), y generalmente es un constructor nular . En otros lenguajes (por ejemplo, en C ++) es un constructor que se puede llamar sin tener que proporcionar ningún argumento, independientemente de si el constructor es autogenerado o definido por el usuario. Tenga en cuenta que aún se puede llamar a un constructor con parámetros formales sin argumentos si los argumentos predeterminados se proporcionaron en la definición del constructor.
C ++
En C ++ , el estándar describe el constructor predeterminado para una clase como un constructor que se puede llamar sin argumentos (esto incluye un constructor cuyos parámetros tienen todos argumentos predeterminados). [1] Por ejemplo:
class MyClass { public : MyClass (); // constructor declaradoprivado : int x ; };MyClass :: MyClass () : x ( 100 ) // definido por el constructor { }int main () { MyClass m ; // en tiempo de ejecución, se crea el objeto m y se llama al constructor predeterminado }
Al asignar memoria dinámicamente, se puede llamar al constructor agregando paréntesis después del nombre de la clase. En cierto sentido, esta es una llamada explícita al constructor:
int main () { MyClass * puntero = new MyClass (); // en tiempo de ejecución, se crea un objeto y // se llama al constructor predeterminado }
Si el constructor tiene uno o más parámetros, pero todos tienen valores predeterminados, sigue siendo un constructor predeterminado. Recuerde que cada clase puede tener como máximo un constructor predeterminado, ya sea uno sin parámetros o uno cuyos parámetros tengan valores predeterminados, como en este caso:
class MyClass { public : MyClass ( int i = 0 , std :: string s = "" ); // constructor declaradoprivado : int x ; int y ; std :: string z ; };MyClass :: MyClass ( int i , std :: string s ) // definido por el constructor { x = 100 ; y = yo ; z = s ; }
En C ++, los constructores predeterminados son importantes porque se invocan automáticamente en determinadas circunstancias; y por lo tanto, en estas circunstancias, es un error que una clase no tenga un constructor predeterminado:
- Cuando el valor de un objeto se declara sin una lista de argumentos (por ejemplo
MyClass x;
:) o se asigna dinámicamente sin una lista de argumentos (por ejemplo:new MyClass;
onew MyClass();
), el constructor predeterminado deMyClass
se utiliza para inicializar el objeto. - Cuando se declara una matriz de objetos, por ejemplo
MyClass x[10];
; o asignados dinámicamente, por ejemplonew MyClass [10]
. El constructor predeterminado deMyClass
se utiliza para inicializar todos los elementos. - Cuando un constructor de clase derivada no llama explícitamente al constructor de clase base en su lista de inicializadores, se llama al constructor predeterminado para la clase base.
- Cuando un constructor de clase no llama explícitamente al constructor de uno de sus campos con valores de objeto en su lista de inicializadores, se llama al constructor predeterminado para la clase del campo.
- En la biblioteca estándar, ciertos contenedores "completan" valores usando el constructor predeterminado cuando el valor no se da explícitamente. Por ejemplo,
vector
inicializa el vector con diez elementos, que se rellenan con un(10); MyClass
objeto construido por defecto .
Si una clase no tiene constructores definidos explícitamente, el compilador declarará y definirá implícitamente un constructor predeterminado para ella. Este constructor predeterminado definido implícitamente es equivalente a uno definido explícitamente con un cuerpo vacío. Por ejemplo: [2]
clase MyClass { int x ; // sin constructor, por lo que el compilador produce un constructor predeterminado (implícito) };int main () { MyClass m ; // no hay error en tiempo de ejecución: se llama al constructor predeterminado (implícito) }
Si los constructores se definen explícitamente para una clase, pero todos no son predeterminados, el compilador no definirá implícitamente un constructor predeterminado, lo que lleva a una situación en la que la clase no tiene un constructor predeterminado. Esta es la razón de un error típico, demostrado por el siguiente ejemplo.
class MyClass { public : MyClass ( int y ); // declarar un constructor no predeterminadoprivado : int x ; };MyClass :: MyClass ( int y ) { x = y ; }int main () { MyClass m ( 100 ); // el constructor no predeterminado se llama MyClass * p ; // para declaraciones de puntero, el compilador no necesita conocer los constructores p = new MyClass (); // error en la compilación: no hay constructor predeterminado return 0 ; }
Dado que ni el programador ni el compilador han definido un constructor por defecto, la creación del objeto objetado apuntado por p
conduce a un error. [3]
Por otro lado, en C ++ 11 se puede crear explícitamente un constructor predeterminado:
class MyClass { public : MyClass () = predeterminado ; // forzar la generación de un constructor predeterminado };
O explícitamente inhibido:
class MyClass { public : MyClass () = eliminar ; // evitar la generación del constructor predeterminado };
Java y C #
Tanto en Java como en C # , un "constructor predeterminado" se refiere a un constructor nular que el compilador genera automáticamente si no se han definido constructores para la clase. El constructor predeterminado llama implícitamente al constructor nular de la superclase y luego ejecuta un cuerpo vacío. Todos los campos se dejan en su valor inicial de 0 (tipos enteros), 0.0 (tipos de punto flotante), false
( boolean
tipo) o null
(tipos de referencia). Un constructor definido por el programador que no toma parámetros también se denomina constructor predeterminado en C # , pero no en Java . [4] [5]
Referencias
- ^ Estándar C ++, ISO / IEC 14882: 1998, 12.1.5
Estándar C ++, ISO / IEC 14882: 2003, 12.1.5 - ^ Informática: un enfoque estructurado con C ++ por Behrouz A. Forouzan y Richard F. Gilberg
- ^ Informática: un enfoque estructurado con C ++ por Behrouz A. Forouzan y Richard F. Gilberg
- ^ Especificación del lenguaje Java, 3ª edición, sección 8.8.9 , "Constructor predeterminado".
- ^ Uso de constructores (Guía de programación de C #)