Constructor predeterminado

El constructor predeterminado , en los lenguajes de programación orientados a objetos,  es un constructor al que se puede llamar sin argumentos . 

En C++ y Java , si no hay constructores definidos explícitamente en una clase , el compilador usa el constructor predeterminado definido implícitamente y, por lo general, es un constructor nulo. Si el programador especificó explícitamente solo un constructor con parámetros, entonces el compilador no creará un constructor predeterminado.

En C++ y Java, si la clase derivada no llama explícitamente al constructor de la clase base (en C++ en la lista de inicialización, en Java super()en la primera línea), entonces se llama implícitamente al constructor predeterminado.

C++

En C++ , el estándar describe un constructor predeterminado como un constructor al que se puede llamar sin pasar argumentos (incluido un constructor con parámetros que tienen un valor predeterminado). [1] Por ejemplo:

clase Mi Clase { público : Miclase (); // se declara el constructor privado : intx ; _ }; MyClass :: MyClass () : x ( 100 ) // constructor definido { } int principal () { MiClase m ; // mientras se ejecuta el programa, se crea un objeto m Y se llama al constructor predeterminado }

Cuando la memoria se asigna dinámicamente para un objeto, se puede llamar al constructor agregando paréntesis vacíos después del nombre de la clase. En cierto sentido, esta es una llamada de constructor explícita:

int principal () { MiClase * puntero = new MiClase (); // en tiempo de ejecución, se crea el objeto y // se llama al constructor predeterminado }

Si un constructor tiene uno o más parámetros predeterminados, sigue siendo el constructor predeterminado. Cada clase puede tener como máximo un constructor predeterminado, ya sea sin parámetros o con parámetros predeterminados, como en este ejemplo:

clase Mi Clase { público : MiClase ( int i = 0 , std :: string s = "" ); // se declara el constructor (prototipo) privado : intx ; _ int y ; estándar :: stringz ; _ }; MyClass :: MyClass ( int i , std :: string s ) // definido por el constructor { x = 100 ; y = yo ; z = s ; }

En C++, los constructores predeterminados son esenciales porque se les llama automáticamente en determinadas circunstancias y, por lo tanto, en determinadas condiciones, una clase debe tener un constructor predeterminado o, de lo contrario, se producirá un error:

  • Cuando un objeto se declara sin argumentos (por ejemplo, MyClass x;) o se crea una nueva instancia en la memoria (por ejemplo, new MyClass;o new MyClass();).
  • Cuando se declara una matriz de objetos, como MyClass x[10];; o declarado dinámicamente, por ejemplo new MyClass [10]. El constructor predeterminado inicializa todos los miembros.
  • Cuando la clase secundaria no especifica explícitamente el constructor de la clase principal en la lista de inicialización.
  • Cuando un constructor de clase no llama explícitamente al constructor de al menos uno de sus campos de objeto en la lista de inicialización.
  • En la biblioteca estándar, ciertos contenedores completan sus valores utilizando constructores predeterminados si no se especifica explícitamente un valor. Por ejemplo, vector<MyClass>(10);llena un vector con diez elementos inicializados con un constructor predeterminado.

Si una clase no define un constructor predeterminado, el compilador creará uno implícitamente. Será lo mismo que un constructor declarado explícitamente con un cuerpo vacío. Por ejemplo: [2]

clase Mi Clase { intx ; _ }; int principal () { MiClase m ; // no hay ningún error mientras se ejecuta el programa, se llama al constructor implícito }

Si se definen constructores para una clase, pero no hay un constructor predeterminado entre ellos, el compilador no generará uno implícitamente. Esto da como resultado errores como este ejemplo:

clase Mi Clase { público : MiClase ( int y ); // declaración de constructor no predeterminada privado : intx ; _ }; MiClase :: MiClase ( int y ) { x = y_ _ } int principal () { MiClase m ( 100 ); // constructor no predeterminado llamado MyClass * p ; // el compilador no necesita conocer los constructores cuando declara un puntero p = new MyClass (); // error en tiempo de compilación: ningún constructor predeterminado devuelve 0 ; }

La creación de un objeto apuntado ptambién dará como resultado un error. [2]

Por otro lado, con C++ 11 , el constructor predeterminado se puede especificar explícitamente:

clase Mi Clase { público : MiClase () = predeterminado ; // fuerza la generación de un constructor por defecto };

O eliminado explícitamente:

clase Mi Clase { público : MiClase () = eliminar ; // evita la generación del constructor predeterminado };

Java

clase DefaultConstructor { int a = 10 ; int público getInt () { devolver un ; } } clase principal { public static void main ( String [] args ) { DefaultConstructor Dc = nuevo DefaultConstructor (); //Constructor por defecto Sistema . fuera _ println ( Dc . getInt () ); } } // ¡Error!

Notas

  1. Estándar C++, ISO/IEC 14882:1998, 12.1.5
    Estándar C++, ISO/IEC 14882:2003, 12.1.5
  2. 1 2 Informática Un enfoque estructurado usando C++ por Behrouz A. Forouzan y Richard F. Gilberg