Constructor predeterminado

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.

C++

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:

  • Cuando se declara un valor de objeto sin ninguna lista de argumentos (por ejemplo: 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
  • Cuando se declara una matriz de objetos, por ejemplo MyClass x[10];, o se asigna dinámicamente, por ejemplo new MyClass [10], se utiliza el constructor predeterminado de MyClasspara 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 de 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 "rellenan" valores utilizando el constructor predeterminado cuando el valor no se proporciona explícitamente. Por ejemplo, inicializa el vector con diez elementos, que se rellenan con un objeto 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 pconduce 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 };      

Java y C#

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( 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]

Referencias

  1. ^ Estándar C++, ISO/IEC 14882:1998, 12.1.5
    Estándar C++, ISO/IEC 14882:2003, 12.1.5
  2. ^ Ciencias de la computación: un enfoque estructurado con C++, de Behrouz A. Forouzan y Richard F. Gilberg
  3. ^ Ciencias de la computación: un enfoque estructurado con C++, de Behrouz A. Forouzan y Richard F. Gilberg
  4. ^ Especificación del lenguaje Java, 3.ª edición, sección 8.8.9, "Constructor predeterminado".
  5. ^ Uso de constructores (Guía de programación en C#)
Obtenido de "https://es.wikipedia.org/w/index.php?title=Constructor_predeterminado&oldid=1003975789"