Constructor en C++ és un mètode especial que s'invoca automàticament en el moment de la creació de l'objecte. S'utilitza per inicialitzar els membres de dades d'objectes nous en general. El constructor en C++ té el mateix nom que la classe o estructura. Construeix els valors, és a dir, proporciona dades per a l'objecte, per això es coneix com a constructor.
- El constructor és una funció membre d'una classe, el nom de la qual és el mateix que el nom de la classe.
- El constructor és un tipus especial de funció membre que s'utilitza per inicialitzar els membres de dades d'un objecte d'una classe automàticament quan es crea un objecte de la mateixa classe.
- El constructor s'invoca en el moment de la creació de l'objecte. Construeix els valors, és a dir, proporciona dades per a l'objecte, per això es coneix com a constructor.
- Els constructors no retornen valor, per tant no tenen un tipus de retorn.
- Un constructor es crida automàticament quan creem l'objecte de la classe.
- Els constructors es poden sobrecarregar.
- Un constructor no es pot declarar virtual.
Sintaxi de constructors en C++
El prototip del constructor té aquest aspecte:
(list-of-parameters);>
El constructor es pot definir dins de la declaració de classe o fora de la declaració de classe
Sintaxi per definir el constructor dins de la classe
(list-of-parameters) { // constructor definition }> Sintaxi per definir el constructor fora de la classe
: :(list-of-parameters) { // constructor definition }> Exemples de constructors en C++
Els exemples següents mostren com declarar constructors per a una classe en C++:
Exemple 1: Definició del constructor dins de la classe
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>> nom;> >cout <<>'Enter the Fee:'>;> >cin>> quota;> >}> >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;> }> |
>
>
Sortida
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>
Exemple 2: Definició del constructor fora de la classe
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>> nom;> >cout <<>'Enter the Fee:'>;> >cin>> quota;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }> |
>
>
Sortida
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>
Nota: Podem fer que el constructor es defineixi fora de la classe com en linia per fer-lo equivalent a la definició de classe. Però tingueu en compte que en linia no és una instrucció per al compilador, és només la sol·licitud que el compilador pot implementar o no en funció de les circumstàncies.
Característiques dels constructors en C++
Les següents són algunes de les característiques principals dels constructors en C++:
- El nom del constructor és el mateix que el nom de la seva classe.
- Els constructors es declaren majoritàriament a la secció pública de la classe, tot i que es poden declarar a la secció privada de la classe.
- Els constructors no retornen valors; per tant, no tenen un tipus de retorn.
- Un constructor es crida automàticament quan creem l'objecte de la classe.
- Els constructors es poden sobrecarregar.
- Un constructor no es pot declarar virtual.
- No es pot heretar un constructor.
- No es poden fer referència a les adreces del Constructor.
- El constructor fa crides implícites a nou i esborrar operadors durant l'assignació de memòria.
Tipus de constructor en C++
Els constructors es poden classificar en funció de les situacions en què s'utilitzen. Hi ha 4 tipus de constructors en C++:
- Constructor per defecte
- Constructor parametritzat
- Copia el constructor
- Moveu el constructor
Entendrem els tipus de constructors en C++ prenent un exemple del món real. Suposem que has anat a una botiga a comprar un retolador. Quan vols comprar un retolador, quines opcions hi ha? El primer vas a una botiga i dius dóna'm un retolador. Així que només dir-me donar-me un retolador vol dir que no heu establert quina marca i quin color, no heu mencionat res, només heu dit que voleu un retolador. Així que quan vam dir només vull un retolador, sigui quin sigui el marcador que es ven amb freqüència al mercat o a la seva botiga, simplement ho lliurarà. I això és el que és un constructor predeterminat!
El segon mètode és anar a una botiga i dir que vull un retolador de color vermell i marca XYZ. Així que estàs esmentant això i ell et donarà aquest marcador. Així que en aquest cas heu donat els paràmetres. I això és el que és un constructor parametritzat!
Aleshores, el tercer vas a una botiga i dius que vull un retolador com aquest (un retolador físic a la mà). Així que el botiguer veurà aquest marcador. D'acord, i us donarà un marcador nou. Així que còpia d'aquest marcador. I això és el que és un constructor de còpies!
Ara, suposeu que no voleu comprar un marcador nou, sinó que us apropeu del marcador del vostre amic. Significa prendre possessió dels recursos ja presents en lloc d'aconseguir-ne un de nou. Això és el que és un constructor de moviments!
1. Constructor per defecte en C++
A constructor per defecte és un constructor que no accepta cap argument. No té paràmetres. També s'anomena constructor d'argument zero.
Sintaxi del constructor predeterminat
className() { // body_of_constructor }> Exemples de constructor predeterminat
Els exemples següents mostren com utilitzar els constructors predeterminats en C++.
Exemple 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;> }> |
>
>Sortida
a: 10 b: 20>
Nota: Fins i tot si no definim cap constructor explícitament, el compilador proporcionarà automàticament un constructor per defecte de manera implícita.
Exemple 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;> }> |
>
>
Sortida
(no output)>
Com podem veure, podem crear l'objecte de classe student sense passar cap argument fins i tot quan no hem definit cap constructor predeterminat explícit per a això.
2. Constructor parametritzat en C++
Els constructors parametritzats permeten passar arguments als constructors. Normalment, aquests arguments ajuden a inicialitzar un objecte quan es crea. Per crear un constructor parametritzat, només cal que afegiu-hi paràmetres com ho faríeu amb qualsevol altra funció. Quan definiu el cos del constructor, utilitzeu els paràmetres per inicialitzar l'objecte.
Sintaxi del constructor parametritzat
className (parameters...) { // body }> Exemples de constructor parametritzat
Els exemples següents mostren com utilitzar els constructors parametritzats en C++.
Exemple 1: Definició del constructor parametritzat dins de la classe.
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;> }> |
>
>Sortida
p1.x = 10, p1.y = 15>
Exemple 2: Definició de constructor parametritzat fora de la classe.
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;> }> |
>
>Sortida
1001 Ram 10000>
Quan un objecte es declara en un constructor parametritzat, els valors inicials s'han de passar com a arguments a la funció de constructor. La forma normal de declarar l'objecte pot no funcionar. Els constructors parametritzats es poden cridar de manera explícita o implícita:
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
Quan es defineix el constructor parametritzat i no es defineix cap constructor predeterminat explícitament, el compilador no crearà implícitament el constructor per defecte i, per tant, crearà un objecte simple com:
Student s;>
parpellejarà un error.
Exemple 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;> }> |
>
>
Sortida
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 important: Sempre que definim un o més constructors no predeterminats (amb paràmetres) per a una classe, un constructor predeterminat (sense paràmetres) també s'hauria de definir explícitament, ja que el compilador no proporcionarà un constructor predeterminat en aquest cas. Tanmateix, no és necessari, però es considera que és la millor pràctica definir sempre un constructor predeterminat.
Usos del constructor parametritzat
- S'utilitza per inicialitzar els diferents elements de dades de diferents objectes amb diferents valors quan es creen.
- S'utilitza per sobrecarregar els constructors.
Arguments per defecte amb el constructor parametritzat C++
Igual que les funcions normals, també podem definir valors per defecte per als arguments dels constructors parametritzats. Totes les regles de la arguments per defecte s'aplicarà a aquests paràmetres.
Exemple 3: definició del constructor parametritzat amb valors per defecte
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;> }> |
>
>Sortida
First Object Data: 0 Second Object Data: 25>
Com podem veure, quan s'assignen els valors per defecte a cada argument del constructor parametritzat, és legal crear l'objecte sense passar cap paràmetre igual que els constructors predeterminats. Per tant, aquest tipus de constructor funciona com a constructor predeterminat i parametritzat.
3. Copia el constructor en C++
Un constructor de còpia és una funció membre que inicialitza un objecte utilitzant un altre objecte de la mateixa classe.
Sintaxi de Copia el constructor
Copia el constructor pren una referència a un objecte de la mateixa classe com a argument.
ClassName (ClassName &obj) { // body_containing_logic }> Igual que el constructor predeterminat, el compilador C++ també proporciona un constructor de còpia implícita si la definició del constructor de còpia explícita no està present. Aquí, cal tenir en compte que, a diferència del constructor per defecte, on la presència de qualsevol tipus de constructor explícit provoca la supressió del constructor implícit per defecte, el compilador sempre crearà el constructor de còpia implícita si no hi ha un constructor de còpia explícit. o hi ha un constructor de moviment explícit.
Exemples de Copy Constructor
Els exemples següents mostren com utilitzar els constructors de còpia en C++.
Exemple 1: Il·lustració del constructor de còpia 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;> }> |
>
>Sortida
ID=10 ID=10>
Exemple 2: definició del constructor de còpia 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;> }> |
>
va néixer freddie mercury
>Sortida
ID=10 ID=10>
Exemple 3: Definició d'un constructor de còpia explícita amb un constructor parametritzat
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;> }> |
>
>Sortida
1001 Manjeet 10000 1001 Manjeet 10000>
Usos de Copy Constructor
- Construeix un objecte nou copiant valors d'un objecte existent.
- Es pot utilitzar per realitzar una còpia profunda.
- Modifiqueu atributs específics durant el procés de còpia si cal.
4. Mou el constructor en C++
El constructor de moviment és una incorporació recent a la família de constructors en C++. És com un constructor de còpies que construeix l'objecte a partir dels objectes ja existents, però en comptes de copiar l'objecte a la nova memòria, fa ús de la semàntica de moviment per transferir la propietat de l'objecte ja creat al nou objecte sense crear un objecte addicional. còpies.
Es pot veure com robar els recursos d'altres objectes.
Sintaxi de Move Constructor en C++
className (className&& obj) { // body of the constructor }> El moure el constructor pren el referència de rvalue de l'objecte de la mateixa classe i transfereix la propietat d'aquest objecte a l'objecte de nova creació.
Com un constructor de còpia, el compilador crearà un constructor de moviment per a cada classe que no tingui cap constructor de moviment explícit.
Exemples de Move Constructor
Els exemples següents mostren com utilitzar els constructors de moviment en C++.
Exemple 1: Definició del constructor de moviment
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;> }> |
>
>Sortida
Move Constructor Called newBox.data: 42>
Usos de Move Constructor
- En lloc de fer còpies, els constructors de moviment transfereixen de manera eficient la propietat d'aquests recursos.
- Això evita la còpia de memòria innecessària i redueix la sobrecàrrega.
- Podeu definir el vostre propi constructor de moviments per gestionar transferències de recursos específiques.
Destructors in C++
Un destructor també és una funció membre especial com a constructor. Destructor destrueix els objectes de classe creats pel constructor. Destructor té el mateix nom que el nom de la seva classe precedit d'un símbol de tilde (~). No és possible definir més d'un destructor. El destructor és només una manera de destruir l'objecte creat pel constructor. Per tant, el destructor no es pot sobrecarregar. Destructor no requereix cap argument ni retorna cap valor. Es crida automàticament quan l'objecte surt de l'abast. Els destructors alliberen l'espai de memòria ocupat pels objectes creats pel constructor. En destructor , els objectes es destrueixen al revés de la creació d'objectes.
Sintaxi dels destructors en C++
Igual que els constructors, els destructors també es poden definir dins o fora de la classe.
La sintaxi per definir el destructor dins de la classe
~ (){}> La sintaxi per definir el destructor fora de la classe
: : ~(){}> Exemples de destructors en C++
Els exemples següents mostren com utilitzar els destructors en C++.
Exemple 1: Definició d'un destructor simple
C++
#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>'
Constructor executed'>; }> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Sortida
Constructor executed Destructor executed>
Exemple 2: Comptar el nombre de vegades que l'objecte es crea i es destrueix
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;> }> |
>
>
Sortida
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ístiques dels destructors en C++
Les següents són algunes de les característiques principals dels destructors en C++:
- Destructor és invocat automàticament pel compilador quan el seu constructor corresponent surt de l'abast i allibera l'espai de memòria que ja no requereix el programa.
- Destructor no requereix cap argument ni retorna cap valor, per tant no es pot sobrecarregar.
- El destructor no es pot declarar com a estàtic i const;
- El destructor s'ha de declarar a la secció pública del programa.
- El destructor es crida en l'ordre invers de la invocació del seu constructor.
Preguntes freqüents sobre constructors C++
Quines són les funcions que genera el compilador per defecte, si no les proporcionem de manera explícita?
Les funcions que el compilador genera per defecte si no les proporcionem explícitament són:
- Constructor per defecte
- Copia el constructor
- Moure els constructors
- Operador d'assignació
- Destructor
Podem fer privats els constructors?
Sí, en C++, els constructors es poden fer privats. Això vol dir que cap codi extern pot crear directament un objecte d'aquesta classe.
Com es diferencien els constructors d'una funció de membre normal?
Un constructor és diferent de les funcions normals de les maneres següents:
- El constructor té el mateix nom que la pròpia classe
- Els constructors predeterminats no tenen argument d'entrada, però els constructors de còpia i parametritzats tenen arguments d'entrada
- Els constructors no tenen tipus de retorn
- Un constructor es crida automàticament quan es crea un objecte.
- S'ha de col·locar a la secció pública de classe.
- Si no especifiquem un constructor, el compilador C++ genera un constructor predeterminat per a l'objecte (no espera paràmetres i té un cos buit).
Podem tenir més d'un constructor en una classe?
Sí, podem tenir més d'un constructor en una classe. Es diu Sobrecàrrega del constructor .
Articles relacionats:
- Destructors in C++
- Test sobre constructors en C++
- Sortida de programes C++ | Set 26 (constructors)
- Sortida de programes C++ | Set 27 (Constructors i destructors)