En los lenguajes de programación informática , el término constructor predeterminado puede referirse a un constructor que genera automáticamente 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 tener que proporcionar ningún argumento, independientemente de si el constructor se genera automáticamente o se define por el usuario. Tenga en cuenta que un constructor con parámetros formales aún se puede llamar sin argumentos si se proporcionaron argumentos predeterminados en la definición del constructor.
En C++ , el estándar describe el constructor predeterminado de 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:
clase MyClass { public : MyClass (); // constructor declarado privado : int x ; }; MyClass :: MyClass () : x ( 100 ) // constructor definido { } 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, se trata de una llamada explícita al constructor:
int main () { MyClass * pointer = 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 ellos 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 todos los valores predeterminados, como en este caso:
clase MiClase { public : MiClase ( int i = 0 , std :: string s = "" ); // constructor declarado privado : int x ; int y ; std :: cadena z ; }; MiClase :: MiClase ( int i , std :: string s ) // constructor definido { x = 100 ; y = i ; 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:
MyClass x;
) o se asigna dinámicamente sin ninguna lista de argumentos (por ejemplo: new MyClass;
o ), se utiliza new MyClass();
el constructor predeterminado de para inicializar el objeto.MyClass
MyClass x[10];
, o se asigna dinámicamente, por ejemplo new MyClass [10]
, se utiliza el constructor predeterminado de MyClass
para inicializar todos los elementos.vector<MyClass>(10);
construido de forma predeterminada .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 de forma explícita para una clase, pero ninguno de ellos es predeterminado, el compilador no definirá implícitamente un constructor predeterminado, lo que dará lugar a una situación en la que la clase no tiene un constructor predeterminado. Esta es la razón de un error típico, que se demuestra en el siguiente ejemplo.
clase MyClass { public : MyClass ( int y ); // declaración de un constructor no predeterminado privado : int x ; }; MiClase :: MiClase ( int y ) { x = y ; } int main () { MyClass m ( 100 ); // el constructor no predeterminado se llama MyClass * p ; // para las declaraciones de puntero, el compilador no necesita saber acerca de los constructores p = new MyClass (); // error en la compilación: no hay un constructor predeterminado que devuelva 0 ; }
Dado que ni el programador ni el compilador han definido un constructor predeterminado, la creación del objeto señalado por p
conduce a un error. [3]
Por otra parte, 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 ; // evitar la generación del constructor predeterminado };
Tanto en Java como en C# , un "constructor predeterminado" hace referencia a un constructor nulo que genera automáticamente el compilador 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 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]