Konstruktør i C++ er en spesiell metode som påkalles automatisk når objektet opprettes. Den brukes til å initialisere datamedlemmene til nye objekter generelt. Konstruktøren i C++ har samme navn som klassen eller strukturen. Den konstruerer verdiene, dvs. gir data for objektet, og det er derfor det er kjent som en konstruktør.
- Konstruktør er en medlemsfunksjon i en klasse, hvis navn er det samme som klassenavnet.
- Konstruktør er en spesiell type medlemsfunksjon som brukes til å initialisere datamedlemmene for et objekt i en klasse automatisk når et objekt av samme klasse opprettes.
- Konstruktøren påkalles på tidspunktet for objektoppretting. Den konstruerer verdiene, dvs. gir data for objektet, det er derfor det er kjent som en konstruktør.
- Konstruktører returnerer ikke verdi, derfor har de ikke en returtype.
- En konstruktør blir kalt automatisk når vi lager objektet til klassen.
- Konstruktører kan bli overbelastet.
- En konstruktør kan ikke erklæres virtuell.
Syntaks for konstruktører i C++
Prototypen til konstruktøren ser slik ut:
(list-of-parameters);>
Konstruktøren kan defineres inne i klasseerklæringen eller utenfor klasseerklæringen
streng til json java
Syntaks for å definere konstruktøren i klassen
(list-of-parameters) { // constructor definition }> Syntaks for å definere konstruktøren utenfor klassen
: :(list-of-parameters) { // constructor definition }> Eksempler på konstruktører i C++
Eksemplene nedenfor viser hvordan man deklarerer konstruktører for en klasse i C++:
Eksempel 1: Definere konstruktøren i klassen
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>> navn;> >cout <<>'Enter the Fee:'>;> >cin>> gebyr;> >}> >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;> }> |
>
>
Produksjon
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>
Eksempel 2: Definere konstruktøren utenfor klassen
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>> navn;> >cout <<>'Enter the Fee:'>;> >cin>> gebyr;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }> |
>
>
Produksjon
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>
Merk: Vi kan lage konstruktøren definert utenfor klassen som på linje for å gjøre det ekvivalent med definisjonen i klassen. Men merk det på linje er ikke en instruksjon til kompilatoren, det er bare forespørselen som kompilatoren kan eller ikke kan implementere avhengig av omstendighetene.
Kjennetegn på konstruktører i C++
Følgende er noen hovedkarakteristika for konstruktørene i C++:
- Navnet på konstruktøren er det samme som klassenavnet.
- Konstruktører er for det meste erklært i den offentlige delen av klassen, selv om de kan erklæres i den private delen av klassen.
- Konstruktører returnerer ikke verdier; derfor har de ikke en returtype.
- En konstruktør blir kalt automatisk når vi lager objektet til klassen.
- Konstruktører kan bli overbelastet.
- En konstruktør kan ikke erklæres virtuell.
- En konstruktør kan ikke arves.
- Adressene til konstruktøren kan ikke henvises til.
- Konstruktøren foretar implisitte kall til ny og slette operatører under minnetildeling.
Typer konstruktører i C++
Konstruktører kan klassifiseres basert på hvilke situasjoner de brukes i. Det er 4 typer konstruktører i C++:
- Standard konstruktør
- Parameterisert konstruktør
- Kopier Konstruktør
- Flytt konstruktør
La oss forstå typene konstruktører i C++ ved å ta et eksempel fra den virkelige verden. Tenk deg at du gikk til en butikk for å kjøpe en tusj. Når du vil kjøpe en markør, hva er alternativene? Den første går du til en butikk og sier gi meg en tusj. Så bare det å si gi meg en markør betyr at du ikke har angitt hvilket merkenavn og hvilken farge, du nevnte ingenting, bare si at du vil ha en markør. Så når vi sa at jeg bare vil ha en tusj, uansett hva den ofte solgte tusj er der i markedet eller butikken hans, vil han ganske enkelt overlevere den. Og dette er hva en standardkonstruktør er!
Den andre metoden er at du går til en butikk og sier at jeg vil ha en rød markør og XYZ-merke. Så du nevner dette, og han vil gi deg den markøren. Så i dette tilfellet har du gitt parametrene. Og dette er hva en parameterisert konstruktør er!
Så den tredje går du til en butikk og sier at jeg vil ha en tusj som denne (en fysisk tusj på hånden din). Så butikkeieren vil se den markøren. Ok, og han vil gi deg en ny markør. Så kopi av den markøren. Og det er det en kopikonstruktør er!
Anta nå at du ikke kjøper en ny markør, men i stedet tar eierskap av vennens markør. Det betyr å ta eierskap til allerede eksisterende ressurser i stedet for å få en ny. Det er det en flyttekonstruktør er!
1. Standard konstruktør i C++
EN standard konstruktør er en konstruktør som ikke tar noen argumenter. Den har ingen parametere. Det kalles også en nullargumentkonstruktør.
Syntaks for standard konstruktør
className() { // body_of_constructor }> Eksempler på Default Constructor
Eksemplene nedenfor viser hvordan du bruker standardkonstruktørene i C++.
Eksempel 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;> }> |
>
>Produksjon
a: 10 b: 20>
Merk: Selv om vi ikke definerer noen konstruktør eksplisitt, vil kompilatoren automatisk gi en standard konstruktør implisitt.
Eksempel 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;> }> |
>
>
Produksjon
(no output)>
Som vi kan se, er vi i stand til at objektet til klassestudenten blir opprettet uten å bestå noen argumenter selv når vi ikke har definert noen eksplisitt standardkonstruktør for det.
2. Parameterisert konstruktør i C++
Parameteriserte konstruktører gjør det mulig å sende argumenter til konstruktører. Vanligvis hjelper disse argumentene med å initialisere et objekt når det opprettes. For å lage en parameterisert konstruktør, legg ganske enkelt til parametere på den måten du ville gjort i en hvilken som helst annen funksjon. Når du definerer konstruktørens kropp, bruk parameterne for å initialisere objektet.
Syntaks for parameterisert konstruktør
className (parameters...) { // body }> Eksempler på parameterisert konstruktør
Eksemplene nedenfor viser hvordan du bruker de parameteriserte konstruktørene i C++.
Eksempel 1: Definere parameterisert konstruktør i klassen.
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;> }> |
>
>Produksjon
p1.x = 10, p1.y = 15>
Eksempel 2: Definere parameterisert konstruktør utenfor klassen.
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;> }> |
>
>Produksjon
1001 Ram 10000>
Når et objekt er deklarert i en parameterisert konstruktør, må startverdiene sendes som argumenter til konstruktørfunksjonen. Det kan hende at den vanlige måten for objektdeklarering ikke fungerer. De parameteriserte konstruktørene kan kalles eksplisitt eller implisitt:
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
Når den parameteriserte konstruktøren er definert og ingen standardkonstruktør er definert eksplisitt, vil ikke kompilatoren implisitt lage standardkonstruktøren og dermed lage et enkelt objekt som:
Student s;>
vil blinke en feil.
Eksempel 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;> }> |
>
>
Produksjon
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 ^~> Viktig notat: Når vi definerer en eller flere ikke-standard konstruktører (med parametere ) for en klasse, bør en standard konstruktør (uten parametere) også være eksplisitt definert ettersom kompilatoren ikke vil gi en standard konstruktør i dette tilfellet. Det er imidlertid ikke nødvendig, men det anses å være den beste praksisen å alltid definere en standardkonstruktør.
Bruk av parametrisert konstruktør
- Den brukes til å initialisere de forskjellige dataelementene til forskjellige objekter med forskjellige verdier når de opprettes.
- Den brukes til å overbelaste konstruktører.
Standardargumenter med C++ Parameterized Constructor
Akkurat som vanlige funksjoner, kan vi også definere standardverdier for argumentene til parameteriserte konstruktører. Alle reglene i standardargumenter vil bli brukt på disse parameterne.
Eksempel 3: Definere parameterisert konstruktør med standardverdier
C++
mysql liste brukere
// 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;> }> |
>
>Produksjon
First Object Data: 0 Second Object Data: 25>
Som vi kan se, når standardverdiene tildeles hvert argument til den parameteriserte konstruktøren, er det lovlig å lage objektet uten å sende noen parametere akkurat som standardkonstruktører. Så denne typen konstruktør fungerer både som en standard og parameterisert konstruktør.
3. Kopier Constructor i C++
En kopikonstruktør er en medlemsfunksjon som initialiserer et objekt ved å bruke et annet objekt av samme klasse.
Syntaks av Kopier Konstruktør
Kopi konstruktør tar en referanse til et objekt av samme klasse som et argument.
ClassName (ClassName &obj) { // body_containing_logic }> Akkurat som standardkonstruktøren, gir C++-kompilatoren også en implisitt kopikonstruktør hvis den eksplisitte kopikonstruktørdefinisjonen ikke er til stede. Her skal det bemerkes at, i motsetning til standardkonstruktøren der tilstedeværelsen av en hvilken som helst type eksplisitt konstruktør resulterer i sletting av den implisitte standardkonstruktøren, vil den implisitte kopikonstruktøren alltid opprettes av kompilatoren hvis det ikke er noen eksplisitt kopikonstruktør eller eksplisitt flyttekonstruktør er tilstede.
Eksempler på Copy Constructor
Eksemplene nedenfor viser hvordan du bruker kopikonstruktørene i C++.
Eksempel 1: Illustrasjon av Implicit Copy Constructor
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;> }> |
>
>Produksjon
ID=10 ID=10>
Eksempel 2: Definering av eksplisitt kopi-konstruktør
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;> }> |
>
>Produksjon
ID=10 ID=10>
Eksempel 3: Definering av eksplisitt kopikonstruktør med parameterisert konstruktør
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;> }> |
>
>Produksjon
1001 Manjeet 10000 1001 Manjeet 10000>
Bruk av Copy Constructor
- Konstruerer et nytt objekt ved å kopiere verdier fra et eksisterende objekt.
- Kan brukes til å utføre dyp kopiering.
- Endre spesifikke attributter under kopieringsprosessen om nødvendig.
4. Flytt Constructor i C++
Flyttekonstruktøren er et nylig tillegg til familien av konstruktører i C++. Det er som en kopikonstruktør som konstruerer objektet fra de allerede eksisterende objektene., men i stedet for å kopiere objektet i det nye minnet, bruker det flyttesemantikk for å overføre eierskapet til det allerede opprettede objektet til det nye objektet uten å lage ekstra kopier.
Det kan sees på som å stjele ressursene fra andre objekter.
Syntaks for Move Constructor i C++
className (className&& obj) { // body of the constructor }> De flytte konstruktør tar rverdireferanse av objektet i samme klasse og overfører eierskapet til dette objektet til det nyopprettede objektet.
Som en kopikonstruktør vil kompilatoren lage en flyttekonstruktør for hver klasse som ikke har noen eksplisitt flyttekonstruktør.
Eksempler på Move Constructor
Eksemplene nedenfor viser hvordan du bruker flyttekonstruktørene i C++.
Eksempel 1: Definere Move Constructor
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;> }> |
>
nettverksoperativsystem
>Produksjon
Move Constructor Called newBox.data: 42>
Bruk av Move Constructor
- I stedet for å lage kopier, overfører flyttekonstruktører effektivt eierskap til disse ressursene.
- Dette forhindrer unødvendig minnekopiering og reduserer overhead.
- Du kan definere din egen flyttekonstruktør for å håndtere spesifikke ressursoverføringer.
Destruktorer i C++
En destruktor er også en spesiell medlemsfunksjon som konstruktør. Destructor ødelegger klasseobjektene laget av konstruktøren. Destructor har samme navn som klassenavnet foran med et tilde-symbol (~). Det er ikke mulig å definere mer enn én destruktor. Destruktoren er bare én måte å ødelegge objektet skapt av konstruktøren. Destruktoren kan derfor ikke overbelastes. Destructor krever verken noe argument eller returnerer noen verdi. Den kalles automatisk når objektet går utenfor rekkevidde. Destruktorer frigjør minneplass okkupert av objektene laget av konstruktøren. I ødelegger , blir objekter ødelagt i motsatt rekkefølge av objektskaping.
Syntaks for destruktorer i C++
Som konstruktører kan destruktorer også defineres enten innenfor eller utenfor klassen.
Syntaksen for å definere destruktoren i klassen
~ (){}> Syntaksen for å definere destruktoren utenfor klassen
: : ~(){}> Eksempler på destruktorer i C++
Eksemplene nedenfor viser hvordan du bruker destruktorene i C++.
Eksempel 1: Definere en enkel destruktor
C++
#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>'
Constructor executed'>; }> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Produksjon
Constructor executed Destructor executed>
Eksempel 2: Å telle antall ganger objektet er opprettet og ødelagt
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;> }> |
>
>
Produksjon
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>
Kjennetegn på destruktorer i C++
Følgende er noen hovedkjennetegn ved destruktorer i C++:
- Destructor påkalles automatisk av kompilatoren når dens korresponderende konstruktør går utenfor omfanget og frigjør minneplassen som ikke lenger kreves av programmet.
- Destructor verken krever noe argument eller returnerer noen verdi, derfor kan den ikke overbelastes.
- Destructor kan ikke erklæres som statisk og konstant;
- Destruktor bør erklæres i den offentlige delen av programmet.
- Destructor kalles i omvendt rekkefølge av konstruktøroppkallingen.
Ofte stilte spørsmål om C++-konstruktører
Hva er funksjonene som genereres av kompilatoren som standard, hvis vi ikke gir dem eksplisitt?
Funksjonene som genereres av kompilatoren som standard hvis vi ikke gir dem eksplisitt er:
- Standard konstruktør
- Kopier Konstruktør
- Flytt konstruktører
- Oppdragsoperatør
- ødelegger
Kan vi gjøre konstruktørene private?
Ja, i C++ kan konstruktører gjøres private. Dette betyr at ingen ekstern kode kan opprette et objekt av den klassen direkte.
Hvordan er konstruktører forskjellige fra en vanlig medlemsfunksjon?
En konstruktør er forskjellig fra vanlige funksjoner på følgende måter:
- Konstruktør har samme navn som selve klassen
- Standard konstruktører har ikke input-argument, men Kopier og Parameterized Constructors har input-argumenter
- Konstruktører har ikke returtype
- En konstruktør kalles automatisk når et objekt opprettes.
- Den må plasseres i den offentlige delen av klassen.
- Hvis vi ikke spesifiserer en konstruktør, genererer C++ kompilator en standard konstruktør for objekt (forventer ingen parametere og har en tom kropp).
Kan vi ha mer enn én konstruktør i en klasse?
Ja, vi kan ha mer enn én konstruktør i en klasse. Det kalles Overbelastning av konstruktør .
Relaterte artikler:
- Destruktorer i C++
- Quiz om konstruktører i C++
- Utgang av C++-programmer | Sett 26 (konstruktører)
- Utgang av C++-programmer | Sett 27 (konstruktører og destruktorer)