Constructor predeterminado y palabra clave predeterminada en C++
Este artículo habla sobre los constructores predeterminados en C++ y la palabra clave recién introducida default
.
Primero, aprendamos sobre el constructor predeterminado en C++. El constructor predeterminado es un tipo especial de constructor que no tiene argumentos y se usa para establecer valores predeterminados para los miembros de datos de una clase.
Ejemplo:
class demo {
int age;
int id;
public:
demo() {
age = 10;
id = 1;
}
};
Palabra clave predeterminada
y función predeterminada en C++
La versión C++ 11 introdujo una nueva forma de declaración de funciones para declarar explícitamente las funciones predeterminadas con la ayuda del especificador =default
. Podemos declarar explícitamente una función predeterminada agregando esto al final de la declaración de la función.
Hacer que una función sea explícitamente predeterminada tiene ventajas, ya que obliga al compilador a generar la implementación predeterminada. Y en términos de eficiencia, son mejores que las funciones implementadas manualmente.
Por ejemplo, al crear un constructor parametrizado en una clase
, el compilador no crea ni agrega un constructor predeterminado en el programa. Podemos usar el = predeterminado
para crear un constructor predeterminado en esos casos.
Código de ejemplo:
#include <bits/stdc++.h>
using namespace std;
class demo {
public:
int x;
demo(int temp) // parameterized constructor
{
x = temp;
}
demo() = default;
};
int main() {
demo d; // uses default constructor
demo d2(200); // uses parameterized constructor
}
Podemos ver que después del constructor parametrizado, hemos usado el especificador =default
para obligar al compilador a crear una versión predeterminada del constructor. Y podemos observar que cuando usamos =default
, no tenemos que especificar el cuerpo de nuestro constructor.
Otra razón para usar =default
en lugar de usar {}
(cuerpo vacío) de la función es que mejora la legibilidad del código.
Cuando se trata del especificador =default
, una regla es que la función no debe tener un argumento predeterminado. Solo las funciones de miembros especiales, como el constructor predeterminado, el constructor de copia o el destructor, pueden establecerse por defecto.
Código de ejemplo:
#include <bits/stdc++.h>
using namespace std;
class demo {
public:
int add() = default;
demo(float, float) = default;
demo(int = 0) = default;
};
int main() {
demo d2(200, 300); // uses parameterized constructor
}
Producción :
[Error] 'int demo::add()' cannot be defaulted
[Error] 'demo::demo(float, float)' cannot be defaulted
[Error] 'demo::demo(int)' cannot be defaulted
El motivo anterior no funciona porque la primera función y la segunda función add()
y demo(float,float)
no son una función miembro especial, y la tercera función demo(int = 0)
tiene algunos argumento predeterminado. Por lo que estas funciones no pueden ser predeterminadas usando =default
; por lo tanto, obtenemos el error de compilación.