En los lenguajes de programación , el término constructor predeterminado se refiere a un constructor generado automáticamente por el compilador en ausencia de constructores definidos por el programador (por ejemplo, en Java), y suele ser un constructor nulo . En otros lenguajes (por ejemplo, en C++), es un constructor que se puede llamar sin necesidad de proporcionar argumentos, independientemente de si es autogenerado o definido por el usuario. Cabe destacar que un constructor con parámetros formales también se puede llamar sin argumentos si se proporcionaron argumentos predeterminados en su definición.
C++
En C++ , el estándar describe el constructor predeterminado de una clase como un constructor que puede llamarse sin argumentos (esto incluye un constructor cuyos parámetros tienen todos argumentos predeterminados). [ 1 ] Por ejemplo:
clase MyClass { privado : int x ; público : // constructor MyClass () : x { 100 } {} };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 modo, esto constituye una llamada explícita al constructor:
int main () { MyClass * p = new MyClass (); // En tiempo de ejecución, se crea un objeto y se llama al constructor predeterminado delete p ; }Si el constructor tiene uno o más parámetros, pero todos tienen valores predeterminados, sigue siendo un constructor predeterminado. Recuerda que cada clase puede tener como máximo un constructor predeterminado, ya sea uno sin parámetros o uno cuyos parámetros tengan todos valores predeterminados, como en este caso:
clase MyClass { privado : int x ; int y ; std :: string z ; público : // constructor MyClass ( int i = 0 , const std :: string & s = "" ) : x { 100 }, y { i }, z { s } {} };En C++, los constructores predeterminados son importantes porque se invocan automáticamente en determinadas circunstancias; por lo tanto, en estas circunstancias, es un error que una clase no tenga un constructor predeterminado:
- Cuando se declara un valor de objeto sin lista de argumentos (por ejemplo:
MyClass x;) o se asigna dinámicamente sin lista de argumentos (por ejemplo:new MyClass;o ), se utilizanew MyClass();el constructor predeterminado de para inicializar el objeto.MyClass - Cuando se declara una matriz de objetos, por ejemplo
MyClass x[10];; o se asigna dinámicamente, por ejemplonew MyClass [10]. El constructor predeterminado deMyClassse utiliza para inicializar todos los elementos. - Cuando el constructor de una clase derivada no llama explícitamente al constructor de la clase base en su lista de inicialización, se llama al constructor predeterminado de la clase base.
- Cuando el constructor de una clase no llama explícitamente al constructor de uno de sus campos con valor de objeto en su lista de inicialización, se llama al constructor predeterminado de la clase de dicho campo.
- En la biblioteca estándar, ciertos contenedores "rellenan" los valores utilizando el constructor predeterminado cuando el valor no se especifica explícitamente. Por ejemplo, inicializa el vector con diez elementos, que se rellenan con un objeto construido por defecto .
vector<MyClass>(10);MyClass
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 ; // no hay 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 se definen constructores explícitamente para una clase, pero ninguno es el predeterminado, el compilador no definirá implícitamente un constructor predeterminado, lo que provocará que la clase no tenga uno. Este es el motivo de un error común, como se muestra en el siguiente ejemplo.
clase MyClass { private : int x ; public : MyClass ( int y ) : x { y } {} // declaración de un constructor no predeterminado }; int main () { MyClass m ( 100 ); // el constructor no predeterminado se llama MyClass * p ; // para declaraciones de punteros, el compilador no necesita saber sobre los constructores p = new MyClass (); // error en la compilación: no hay constructor predeterminado delete p ; return 0 ; }Dado que ni el programador ni el compilador han definido un constructor predeterminado, la creación del objeto al que apunta pconduce a un error. [ 3 ]
Por otro lado, en C++11 se puede crear explícitamente un constructor predeterminado:
clase MyClass { public : MyClass () = default ; // fuerza la generación de un constructor predeterminado };O explícitamente inhibido:
clase MyClass { public : MyClass () = delete ; // evita la generación del constructor predeterminado };Java y C#
Tanto en Java como en C# , un "constructor predeterminado" se refiere a un constructor nulo que el compilador genera automáticamente si no se han definido constructores para la clase. El constructor predeterminado llama implícitamente al constructor nulo de la superclase y luego ejecuta un cuerpo vacío. Todos los campos se dejan con su valor inicial de 0 ( tipos enteros ), 0.0 (tipos de punto flotante), false( booleantipo) 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 ]
Véase también
Referencias
- ↑ Estándar C++, ISO/IEC 14882:1998, 12.1.5Estándar C++, ISO/IEC 14882:2003, 12.1.5
- ↑ Informática: Un enfoque estructurado utilizando C++ por Behrouz A. Forouzan y Richard F. Gilberg
- ↑ Informática: Un enfoque estructurado utilizando 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 en C#)
- Método (programación informática)