logo

Constructores en C++

Constructor en C++ Es un método especial que se invoca automáticamente en el momento de la creación del objeto. Generalmente se utiliza para inicializar los miembros de datos de nuevos objetos. El constructor en C++ tiene el mismo nombre que la clase o estructura. Construye los valores, es decir, proporciona datos para el objeto, por eso se le conoce como constructor.

  • Constructor es una función miembro de una clase, cuyo nombre es el mismo que el nombre de la clase.
  • Constructor es un tipo especial de función miembro que se utiliza para inicializar automáticamente los miembros de datos de un objeto de una clase cuando se crea un objeto de la misma clase.
  • El constructor se invoca en el momento de la creación del objeto. Construye los valores, es decir, proporciona datos para el objeto, por eso se le conoce como constructor.
  • Los constructores no devuelven valor, por lo tanto no tienen un tipo de retorno.
  • Se llama automáticamente a un constructor cuando creamos el objeto de la clase.
  • Los constructores pueden estar sobrecargados.
  • Un constructor no puede declararse virtual.

Sintaxis de constructores en C++

El prototipo del constructor se ve así:

 (list-of-parameters);>

El constructor se puede definir dentro de la declaración de clase o fuera de la declaración de clase.



Sintaxis para definir el constructor dentro de la clase

 (list-of-parameters) {     // constructor definition  }>

Sintaxis para definir el constructor fuera de la clase

: :(list-of-parameters) {    // constructor definition  }>

Ejemplos de constructores en C++

Los siguientes ejemplos demuestran cómo declarar constructores para una clase en C++:

Ejemplo 1: definición del constructor dentro de la clase

C++




// defining the constructor within the class> #include> using> namespace> std;> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >// constructor> >student()> >{> >cout <<>'Enter the RollNo:'>;> >cin>> rno;> >cout <<>'Enter the Name:'>;> >cin>> nombre;> >cout <<>'Enter the Fee:'>;> >cin>> tarifa;> >}> >void> display()> >{> >cout << endl << rno <<>' '> << name <<>' '> << fee;> >}> };> int> main()> {> >student s;>// constructor gets called automatically when> >// we create the object of the class> >s.display();> >return> 0;> }>

>

>

Producción

Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>

Ejemplo 2: definición del constructor fuera de la clase

C++




// defining the constructor outside the class> #include> using> namespace> std;> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >// constructor declaration only> >student();> >void> display();> };> // outside definition of constructor> student::student()> {> >cout <<>'Enter the RollNo:'>;> >cin>> rno;> >cout <<>'Enter the Name:'>;> >cin>> nombre;> >cout <<>'Enter the Fee:'>;> >cin>> tarifa;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }>

>

>

Producción

Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>

Nota: Podemos hacer que el constructor se defina fuera de la clase como en línea para hacerlo equivalente a la definición de clase. Pero tenga en cuenta que en línea no es una instrucción para el compilador, es solo la solicitud que el compilador puede implementar o no dependiendo de las circunstancias.

Características de los constructores en C++

Las siguientes son algunas de las características principales de los constructores en C++:

  • El nombre del constructor es el mismo que el nombre de su clase.
  • La mayoría de los constructores se declaran en la sección pública de la clase, aunque pueden declararse en la sección privada de la clase.
  • Los constructores no devuelven valores; por lo tanto, no tienen un tipo de devolución.
  • Se llama automáticamente a un constructor cuando creamos el objeto de la clase.
  • Los constructores pueden estar sobrecargados.
  • Un constructor no puede declararse virtual.
  • Un constructor no se puede heredar.
  • No se puede hacer referencia a las direcciones del Constructor.
  • El constructor hace llamadas implícitas a nuevo y borrar operadores durante la asignación de memoria.

Tipos de constructor en C++

Los constructores se pueden clasificar según las situaciones en las que se utilizan. Hay 4 tipos de constructores en C++:

  1. Constructor predeterminado
  2. Constructor parametrizado
  3. Constructor de copias
  4. Mover constructor

Entendamos los tipos de constructores en C++ tomando un ejemplo del mundo real. Supongamos que fuiste a una tienda a comprar un marcador. Cuando quieres comprar un marcador, ¿cuáles son las opciones? El primero vas a una tienda y dices dame un marcador. Entonces, simplemente decir dame un marcador significa que no estableciste qué marca y qué color, no mencionaste nada, solo di que quieres un marcador. Entonces, cuando dijimos solo quiero un marcador, cualquiera que sea el marcador que se vende con frecuencia en el mercado o en su tienda, simplemente lo entregará. ¡Y esto es lo que es un constructor predeterminado!

El segundo método es ir a una tienda y decir: quiero un marcador de color rojo y de la marca XYZ. Entonces mencionas esto y él te dará ese marcador. Entonces en este caso has dado los parámetros. ¡Y esto es lo que es un constructor parametrizado!

Luego, el tercero, vas a una tienda y dices: quiero un marcador como este (un marcador físico en tu mano). Entonces el comerciante verá ese marcador. Está bien, y él te dará un nuevo marcador. Entonces copia de ese marcador. ¡Y eso es lo que es un constructor de copias!

Ahora, suponga que no va a comprar un marcador nuevo, sino que se hará cargo del marcador de su amigo. Significa apropiarse de los recursos ya presentes en lugar de adquirir uno nuevo. ¡Eso es lo que es un constructor de movimientos!

1. Constructor predeterminado en C++

A Constructor predeterminado es un constructor que no acepta ningún argumento. No tiene parámetros. También se le llama constructor de argumento cero.

Sintaxis del constructor predeterminado

className() {     // body_of_constructor  }>

Ejemplos de constructor predeterminado

Los siguientes ejemplos demuestran cómo utilizar los constructores predeterminados en C++.

Ejemplo 1:

CPP




// C++ program to illustrate the concept of default> // constructors> #include> using> namespace> std;> class> construct {> public>:> >int> a, b;> >// Default Constructor> >construct()> >{> >a = 10;> >b = 20;> >}> };> int> main()> {> >// Default constructor called automatically> >// when the object is created> >construct c;> >cout <<>'a: '> << c.a << endl <<>'b: '> << c.b;> >return> 1;> }>

>

>

Producción

a: 10 b: 20>

Nota: Incluso si no definimos ningún constructor explícitamente, el compilador proporcionará automáticamente un constructor predeterminado de forma implícita.

Ejemplo 2:

C++




// C++ program to demonstrate the implicit default> // constructor> #include> using> namespace> std;> // class> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> };> int> main()> {> >// creating object without any parameters> >student s;> >return> 0;> }>

>

>

Producción

(no output)>

Como podemos ver, podemos crear el objeto de la clase estudiante sin pasar ningún argumento incluso cuando no hemos definido ningún constructor predeterminado explícito para él.

2. Constructor parametrizado en C++

Los constructores parametrizados permiten pasar argumentos a los constructores. Normalmente, estos argumentos ayudan a inicializar un objeto cuando se crea. Para crear un constructor parametrizado, simplemente agréguele parámetros como lo haría con cualquier otra función. Cuando defina el cuerpo del constructor, utilice los parámetros para inicializar el objeto.

Sintaxis del constructor parametrizado

className (parameters...) {     // body  }>

Ejemplos de constructor parametrizado

Los siguientes ejemplos demuestran cómo utilizar los constructores parametrizados en C++.

Ejemplo 1: Definición de un constructor parametrizado dentro de la clase.

CPP




// CPP program to illustrate parameterized constructors> #include> using> namespace> std;> class> Point {> private>:> >int> x, y;> public>:> >// Parameterized Constructor> >Point(>int> x1,>int> y1)> >{> >x = x1;> >y = y1;> >}> >int> getX() {>return> x; }> >int> getY() {>return> y; }> };> int> main()> {> >// Constructor called> >Point p1(10, 15);> >// Access values assigned by constructor> >cout <<>'p1.x = '> << p1.getX()> ><<>', p1.y = '> << p1.getY();> >return> 0;> }>

>

>

Producción

p1.x = 10, p1.y = 15>

Ejemplo 2: Definición de un constructor parametrizado fuera de la clase.

C++




// C++ Program to illustrate how to define the parameterized> // constructor outside the class> #include> #include> using> namespace> std;> // class definition> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >student(>int>,>char>[],>double>);> >void> display();> };> // parameterized constructor outside class> student::student(>int> no,>char> n[],>double> f)> {> >rno = no;> >strcpy>(name, n);> >fee = f;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s(1001,>'Ram'>, 10000);> >s.display();> >return> 0;> }>

>

>

Producción

1001 Ram 10000>

Cuando se declara un objeto en un constructor parametrizado, los valores iniciales deben pasarse como argumentos a la función constructora. Es posible que la forma normal de declaración de objetos no funcione. Los constructores parametrizados se pueden llamar explícita o implícitamente:

Example e = Example(0, 50);   // Explicit call  Example e(0, 50);    // Implicit call>

Cuando se define el constructor parametrizado y no se define explícitamente ningún constructor predeterminado, el compilador no creará implícitamente el constructor predeterminado y, por lo tanto, creará un objeto simple como:

Student s;>

mostrará un error.

Ejemplo 3:

C++




// C++ Program to illustrate the error caused be not> // defining the explicit defualt constructor after> // parameterized constructor> #include> #include> using> namespace> std;> // class definition> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >student(>int> no,>char> n[],>double> f)> >{> >rno = no;> >strcpy>(name, n);> >fee = f;> >}> };> // driver code> int> main()> {> >student s;>// this will cause error> >return> 0;> }>

>

>

Producción

main.cpp: In function ‘int main()’: main.cpp:25:13: error: no matching function for call to ‘student::student()’  25 | student s; // this will cause error  | ^ main.cpp:14:5: note: candidate: ‘student::student(int, char*, double)’  14 | student(int no, char n[], double f)  | ^~~~~~~ main.cpp:14:5: note: candidate expects 3 arguments, 0 provided main.cpp:8:7: note: candidate: ‘constexpr student::student(const student&)’  8 | class student {  | ^~~~~~~ main.cpp:8:7: note: candidate expects 1 argument, 0 provided main.cpp:8:7: note: candidate: ‘constexpr student::student(student&&)’ main.cpp:8:7: note: candidate expects 1 argument, 0 provided ^~>

Nota IMPORTANTE: Siempre que definimos uno o más constructores no predeterminados (con parámetros) para una clase, también se debe definir explícitamente un constructor predeterminado (sin parámetros), ya que el compilador no proporcionará un constructor predeterminado en este caso. Sin embargo, no es necesario, pero se considera la mejor práctica, definir siempre un constructor predeterminado.

Usos del constructor parametrizado

  • Se utiliza para inicializar los diversos elementos de datos de diferentes objetos con diferentes valores cuando se crean.
  • Se utiliza para sobrecargar constructores.

Argumentos predeterminados con el constructor parametrizado de C++

Al igual que las funciones normales, también podemos definir valores predeterminados para los argumentos de los constructores parametrizados. todas las reglas del argumentos predeterminados se aplicará a estos parámetros.

Ejemplo 3: definición de un constructor parametrizado con valores predeterminados

C++




// C++ Program to illustrate how to use default arguments> // with parameterized constructor> #include> using> namespace> std;> // class> class> GFG {> private>:> >int> data;> public>:> >// parameterized constructor with default values> >GFG(>int> x = 0) { data = x; }> >int> getData() {>return> data; }> };> int> main()> {> >GFG obj1;>// will not throw error> >GFG obj2(25);> >cout <<>'First Object Data: '> << obj1.getData() << endl;> >cout <<>'Second Object Data: '> << obj2.getData()> ><< endl;> >return> 0;> }>

>

>

Producción

First Object Data: 0 Second Object Data: 25>

Como podemos ver, cuando los valores predeterminados se asignan a cada argumento del constructor parametrizado, es legal crear el objeto sin pasar ningún parámetro, al igual que los constructores predeterminados. Entonces, este tipo de constructor funciona como constructor predeterminado y parametrizado.

3. Copiar constructor en C++

Un constructor de copia es una función miembro que inicializa un objeto usando otro objeto de la misma clase.

Sintaxis de Constructor de copias

Copiar constructor toma una referencia a un objeto de la misma clase como argumento.

ClassName (ClassName &obj) {    // body_containing_logic  }>

Al igual que el constructor predeterminado, el compilador de C++ también proporciona un constructor de copia implícito si la definición del constructor de copia explícito no está presente. Aquí, cabe señalar que, a diferencia del constructor predeterminado donde la presencia de cualquier tipo de constructor explícito da como resultado la eliminación del constructor predeterminado implícito, el compilador siempre creará el constructor de copia implícito si no hay un constructor de copia explícito. o está presente un constructor de movimientos explícito.

Ejemplos de constructor de copias

Los siguientes ejemplos demuestran cómo utilizar los constructores de copia en C++.

Ejemplo 1: Ilustración del constructor de copia implícita

C++




// C++ program to illustrate the use of Implicit copy> // constructor> #include> using> namespace> std;> class> Sample {> >int> id;> public>:> >// parameterized constructor> >Sample(>int> x) { id = x; }> >void> display() { cout <<>'ID='> << id; }> };> int> main()> {> >Sample obj1(10);> >obj1.display();> >cout << endl;> >// creating an object of type Sample from the obj> >Sample obj2(obj1);>// or obj2=obj1;> >obj2.display();> >return> 0;> }>

>

>

Producción

ID=10 ID=10>

Ejemplo 2: Definición del constructor de copia explícita

C++




// C++ Program to demonstrate how to define the explicit> // copy constructor> #include> using> namespace> std;> class> Sample {> >int> id;> public>:> >// default constructor with empty body> >Sample() {}> >// parameterized constructor> >Sample(>int> x) { id = x; }> >// copy constructor> >Sample(Sample& t) { id = t.id; }> >void> display() { cout <<>'ID='> << id; }> };> // driver code> int> main()> {> >Sample obj1(10);> >obj1.display();> >cout << endl;> >// copy constructor called> >Sample obj2(obj1);>// or obj2=obj1;> >obj2.display();> >return> 0;> }>

>

>

Producción

ID=10 ID=10>

Ejemplo 3: Definición de un constructor de copia explícita con un constructor parametrizado

C++




// C++ program to demonstrate copy construction along with> // parameterized constructor> #include> #include> using> namespace> std;> // class definition> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >student(>int>,>char>[],>double>);> >student(student& t)>// copy constructor> >{> >rno = t.rno;> >strcpy>(name, t.name);> >fee = t.fee;> >}> >void> display();> };> student::student(>int> no,>char> n[],>double> f)> {> >rno = no;> >strcpy>(name, n);> >fee = f;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> int> main()> {> >student s(1001,>'Manjeet'>, 10000);> >s.display();> >student manjeet(s);>// copy constructor called> >manjeet.display();> >return> 0;> }>

>

>

Producción

1001 Manjeet 10000 1001 Manjeet 10000>

Usos del constructor de copias

  • Construye un nuevo objeto copiando valores de un objeto existente.
  • Se puede utilizar para realizar una copia profunda.
  • Modifique atributos específicos durante el proceso de copia si es necesario.

4. Mover Constructor en C++

El constructor de movimientos es una incorporación reciente a la familia de constructores de C++. Es como un constructor de copias que construye el objeto a partir de los objetos ya existentes, pero en lugar de copiar el objeto en la nueva memoria, utiliza la semántica de movimiento para transferir la propiedad del objeto ya creado al nuevo objeto sin crear más. copias.

Puede verse como un robo de recursos de otros objetos.

Sintaxis de Move Constructor en C++

className (className&& obj) {    // body of the constructor  }>

El mover constructor toma el referencia de valor del objeto de la misma clase y transfiere la propiedad de este objeto al objeto recién creado.

Al igual que un constructor de copia, el compilador creará un constructor de movimiento para cada clase que no tenga ningún constructor de movimiento explícito.

Ejemplos de constructor de movimientos

Los siguientes ejemplos demuestran cómo utilizar los constructores de movimiento en C++.

Ejemplo 1: Definición del constructor Move

C++




// C++ Program to illustrate how to define a move> // constructor> #include> using> namespace> std;> class> Box {> public>:> >int>* data;>// Pointer to an integer value> >// Constructor> >Box(>int> value)> >{> >data =>new> int>;> >*data = value;> >}> >// Move constructor> >Box(Box&& other) noexcept> >{> >cout <<>'Move Constructor Called'> << endl;> >data = other.data;>// Transfer ownership of 'other'> >// data> >other.data = nullptr;>// Null out 'other' to prevent> >// double deletion> >}> >// Destructor> >~Box() {>delete> data; }> };> int> main()> {> >// Create a Box with value 42> >Box originalBox(42);> >// Create a new Box by moving resources from the> >// originalBox> >Box newBox(move(originalBox));> >cout <<>'newBox.data: '> << *newBox.data;> >// originalBox is now in a valid but unspecified> >// state (its resources were moved to newBox)> >return> 0;> }>

>

>

Producción

Move Constructor Called newBox.data: 42>

Usos de Move Constructor

  • En lugar de hacer copias, los constructores de movimientos transfieren de manera eficiente la propiedad de estos recursos.
  • Esto evita la copia innecesaria de memoria y reduce la sobrecarga.
  • Puede definir su propio constructor de movimientos para manejar transferencias de recursos específicas.

Destructores in C++

Un destructor también es una función miembro especial como constructor. El destructor destruye los objetos de clase creados por el constructor. El destructor tiene el mismo nombre que el nombre de su clase precedido por un símbolo de tilde (~). No es posible definir más de un destructor. El destructor es sólo una forma de destruir el objeto creado por el constructor. Por lo tanto, el destructor no se puede sobrecargar. El destructor no requiere ningún argumento ni devuelve ningún valor. Se llama automáticamente cuando el objeto sale del alcance. Los destructores liberan espacio de memoria ocupado por los objetos creados por el constructor. En destructor , los objetos se destruyen en el proceso inverso a la creación del objeto.

Sintaxis de destructores en C++

Al igual que los constructores, los destructores también se pueden definir dentro o fuera de la clase.

La sintaxis para definir el destructor dentro de la clase.

¿Qué es exportar en Linux?
~ (){}>

La sintaxis para definir el destructor fuera de la clase.

: : ~(){}>

Ejemplos de destructores en C++

Los siguientes ejemplos demuestran cómo utilizar los destructores en C++.

Ejemplo 1: definición de un destructor simple

C++




#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>' Constructor executed'>; }> >~Test() { cout <<>' Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }>

>

>

Producción

 Constructor executed Destructor executed>

Ejemplo 2: contar el número de veces que se crea y destruye un objeto

C++




// C++ Program to count the number of objects created and> // destroyed> #include> using> namespace> std;> // global variable to count> int> count = 0;> // class definition> class> Test {> public>:> >Test()> >{> >count++;> >cout <<>'No. of Object created: '> << count << endl;> >}> >~Test()> >{> >cout <<>'No. of Object destroyed: '> << count> ><< endl;> >--count;> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }>

>

>

Producción

No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>

Características de los destructores en C++

Las siguientes son algunas de las características principales de los destructores en C++:

  • El compilador invoca automáticamente el destructor cuando su constructor correspondiente sale del alcance y libera el espacio de memoria que ya no necesita el programa.
  • El destructor no requiere ningún argumento ni devuelve ningún valor, por lo que no se puede sobrecargar.
  • El destructor no puede declararse como estático y constante;
  • El destructor debe declararse en la sección pública del programa.
  • El destructor se llama en el orden inverso a la invocación del constructor.

Preguntas frecuentes sobre constructores de C++

¿Cuáles son las funciones que genera el compilador de forma predeterminada, si no las proporcionamos explícitamente?

Las funciones que genera el compilador por defecto si no las proporcionamos explícitamente son:

  1. Constructor predeterminado
  2. Constructor de copias
  3. Mover constructores
  4. Operador de asignación
  5. Destructor

¿Podemos hacer que los constructores sean privados?

Sí, en C++, los constructores se pueden hacer privados. Esto significa que ningún código externo puede crear directamente un objeto de esa clase.

¿En qué se diferencian los constructores de una función miembro normal?

Un constructor se diferencia de las funciones normales en los siguientes aspectos:

  • El constructor tiene el mismo nombre que la clase misma.
  • Los constructores predeterminados no tienen argumentos de entrada; sin embargo, los constructores copiados y parametrizados tienen argumentos de entrada.
  • Los constructores no tienen tipo de retorno
  • Se llama automáticamente a un constructor cuando se crea un objeto.
  • Debe colocarse en la sección pública de la clase.
  • Si no especificamos un constructor, el compilador de C++ genera un constructor predeterminado para el objeto (no espera parámetros y tiene un cuerpo vacío).

¿Podemos tener más de un constructor en una clase?

Sí, podemos tener más de un constructor en una clase. Se llama Sobrecarga de constructores .

Artículos relacionados:

  • Destructores in C++
  • Cuestionario sobre constructores en C++
  • Salida de programas C++ | Conjunto 26 (Constructores)
  • Salida de programas C++ | Conjunto 27 (Constructores y Destructores)