Konstruktør i C++ er en speciel metode, der aktiveres automatisk på tidspunktet for objektoprettelse. Det bruges til at initialisere datamedlemmerne af nye objekter generelt. Konstruktøren i C++ har samme navn som klassen eller strukturen. Det konstruerer værdierne, dvs. giver data til objektet, hvorfor det er kendt som en konstruktør.
- Konstruktør er en medlemsfunktion af en klasse, hvis navn er det samme som klassenavnet.
- Constructor er en speciel type medlemsfunktion, der bruges til automatisk at initialisere datamedlemmerne for et objekt i en klasse, når et objekt af samme klasse oprettes.
- Konstruktøren påkaldes på tidspunktet for objektoprettelse. Det konstruerer værdierne, dvs. giver data til objektet, derfor er det kendt som en konstruktør.
- Konstruktører returnerer ikke værdi, derfor har de ikke en returtype.
- En konstruktør kaldes automatisk, når vi opretter klassens objekt.
- Konstruktører kan blive overbelastet.
- En konstruktør kan ikke erklæres virtuel.
Syntaks for konstruktører i C++
Prototypen af konstruktøren ser sådan ud:
(list-of-parameters);>
Konstruktøren kan defineres inde i klassedeklarationen eller uden for klassedeklarationen
streng til json java
Syntaks til at definere konstruktøren i klassen
(list-of-parameters) { // constructor definition }> Syntaks til at definere konstruktøren uden for klassen
: :(list-of-parameters) { // constructor definition }> Eksempler på konstruktører i C++
Nedenstående eksempler viser, hvordan man erklærer konstruktører for en klasse i C++:
Eksempel 1: Definition af 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;> }> |
>
>
Produktion
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>
Eksempel 2: Definition af konstruktøren uden for 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;> }> |
>
>
Produktion
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>
Bemærk: Vi kan lave konstruktøren defineret uden for klassen som inline for at gøre det ækvivalent med definitionen i klassen. Men bemærk det inline er ikke en instruktion til compileren, det er kun anmodningen, som compileren kan eller ikke kan implementere afhængigt af omstændighederne.
Karakteristika for konstruktører i C++
Følgende er nogle hovedkarakteristika for konstruktørerne i C++:
- Navnet på konstruktøren er det samme som dens klassenavn.
- Konstruktører er for det meste erklæret i den offentlige del af klassen, selvom de kan erklæres i den private del af klassen.
- Konstruktører returnerer ikke værdier; derfor har de ikke en returtype.
- En konstruktør kaldes automatisk, når vi opretter klassens objekt.
- Konstruktører kan blive overbelastet.
- En konstruktør kan ikke erklæres virtuel.
- En konstruktør kan ikke nedarves.
- Der kan ikke henvises til bygherrens adresser.
- Konstruktøren foretager implicitte opkald til ny og slette operatører under hukommelsestildeling.
Typer af konstruktør i C++
Konstruktører kan klassificeres ud fra, i hvilke situationer de bliver brugt. Der er 4 typer konstruktører i C++:
- Standard konstruktør
- Parametriseret konstruktør
- Kopi konstruktør
- Flyt konstruktør
Lad os forstå typerne af konstruktører i C++ ved at tage et eksempel fra den virkelige verden. Antag, at du gik til en butik for at købe en tusch. Når du vil købe en tusch, hvad er mulighederne så? Den første går du til en butik og siger giv mig en tusch. Så bare det at sige giv mig en markør betyder, at du ikke har angivet hvilket mærke og hvilken farve, du nævnte ikke noget, bare sige du vil have en markør. Så da vi sagde, at jeg bare vil have en tusch, uanset hvad den ofte solgte tusch er der på markedet eller i hans butik, vil han simpelthen aflevere den. Og det er hvad en standardkonstruktør er!
Den anden metode er, at du går til en butik og siger, at jeg vil have en rød markør og XYZ-mærke. Så du nævner dette, og han vil give dig den markør. Så i dette tilfælde har du givet parametrene. Og det er hvad en parametriseret konstruktør er!
Så den tredje går du til en butik og siger, at jeg vil have en tusch som denne (en fysisk tusch på din hånd). Så butiksejeren vil se den markør. Okay, og han vil give en ny markør til dig. Så kopi af den markør. Og det er hvad en kopikonstruktør er!
Antag nu, at du ikke skal købe en ny markør, men i stedet tage ejerskab af din vens markør. Det betyder at tage ejerskab over allerede eksisterende ressourcer i stedet for at få en ny. Det er, hvad en flyttekonstruktør er!
1. Standard konstruktør i C++
EN standard konstruktør er en konstruktør, der ikke tager nogen argumenter. Den har ingen parametre. Det kaldes også en nul-argument konstruktør.
Syntaks for Default Constructor
className() { // body_of_constructor }> Eksempler på Default Constructor
Nedenstående eksempler viser, hvordan man bruger standardkonstruktørerne 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;> }> |
>
>Produktion
a: 10 b: 20>
Bemærk: Selvom vi ikke definerer nogen konstruktør eksplicit, vil compileren automatisk give en standard konstruktør implicit.
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;> }> |
>
>
Produktion
(no output)>
Som vi kan se, er vi i stand til, at klassens elevobjekt oprettes uden at bestå noget argument, selv når vi ikke har defineret nogen eksplicit standardkonstruktør for det.
2. Parametriseret konstruktør i C++
Parametriserede konstruktører gør det muligt at videregive argumenter til konstruktører. Disse argumenter hjælper typisk med at initialisere et objekt, når det oprettes. For at oprette en parameteriseret konstruktør skal du blot tilføje parametre til den, som du ville gøre til enhver anden funktion. Når du definerer konstruktørens krop, skal du bruge parametrene til at initialisere objektet.
Syntaks for Parameterized Constructor
className (parameters...) { // body }> Eksempler på parametreret konstruktør
Nedenstående eksempler viser, hvordan man bruger de parametriserede konstruktører i C++.
Eksempel 1: Definition af parametriseret konstruktør inde 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;> }> |
>
>Produktion
p1.x = 10, p1.y = 15>
Eksempel 2: Definition af parametriseret konstruktør uden for 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;> }> |
>
>Produktion
1001 Ram 10000>
Når et objekt er erklæret i en parameteriseret konstruktør, skal startværdierne sendes som argumenter til konstruktørfunktionen. Den normale måde at angive objekter på fungerer muligvis ikke. De parametriserede konstruktører kan kaldes eksplicit eller implicit:
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
Når den parameteriserede konstruktør er defineret, og ingen standardkonstruktør er defineret eksplicit, vil compileren ikke implicit oprette standardkonstruktøren og dermed oprette et simpelt objekt som:
Student s;>
vil blinke en fejl.
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;> }> |
>
>
Produktion
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 ^~> Vigtig note: Når vi definerer en eller flere ikke-standardkonstruktører (med parametre) for en klasse, skal en standardkonstruktør (uden parametre) også defineres eksplicit, da compileren ikke vil levere en standardkonstruktør i dette tilfælde. Det er dog ikke nødvendigt, men det anses for at være den bedste praksis altid at definere en standardkonstruktør.
Brug af parametriseret konstruktør
- Det bruges til at initialisere de forskellige dataelementer af forskellige objekter med forskellige værdier, når de oprettes.
- Det bruges til at overbelaste konstruktører.
Standardargumenter med C++ Parameterized Constructor
Ligesom normale funktioner kan vi også definere standardværdier for parameteriserede konstruktørers argumenter. Alle reglerne i standard argumenter vil blive anvendt på disse parametre.
Eksempel 3: Definition af parametreret konstruktør med standardværdier
C++
mysql liste brugere
// 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;> }> |
>
>Produktion
First Object Data: 0 Second Object Data: 25>
Som vi kan se, når standardværdierne er tildelt hvert argument i den parameteriserede konstruktør, er det lovligt at oprette objektet uden at videregive nogen parametre ligesom standardkonstruktører. Så denne type konstruktør fungerer som både en standard og parameteriseret konstruktør.
3. Kopier Constructor i C++
En kopikonstruktør er en medlemsfunktion, der initialiserer et objekt ved hjælp af et andet objekt af samme klasse.
Syntaks af Kopi konstruktør
Kopi konstruktør tager en reference til et objekt af samme klasse som et argument.
ClassName (ClassName &obj) { // body_containing_logic }> Ligesom standardkonstruktøren giver C++-kompileren også en implicit kopikonstruktør, hvis den eksplicitte kopikonstruktørdefinition ikke er til stede. Her skal det bemærkes, at i modsætning til standardkonstruktøren, hvor tilstedeværelsen af enhver form for eksplicit konstruktør resulterer i sletning af den implicitte standardkonstruktør, vil den implicitte kopikonstruktør altid oprettes af compileren, hvis der ikke er nogen eksplicit kopikonstruktør. eller eksplicit flyttekonstruktør er til stede.
Eksempler på Copy Constructor
Nedenstående eksempler viser, hvordan man bruger kopikonstruktørerne i C++.
Eksempel 1: Illustration af 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;> }> |
>
>Produktion
ID=10 ID=10>
Eksempel 2: Definition af eksplicit kopikonstruktø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;> }> |
>
>Produktion
ID=10 ID=10>
Eksempel 3: Definition af eksplicit kopikonstruktør med parametriseret 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;> }> |
>
>Produktion
1001 Manjeet 10000 1001 Manjeet 10000>
Brug af Copy Constructor
- Konstruerer et nyt objekt ved at kopiere værdier fra et eksisterende objekt.
- Kan bruges til at udføre dyb kopiering.
- Rediger specifikke attributter under kopieringsprocessen, hvis det er nødvendigt.
4. Flyt Constructor i C++
Flyttekonstruktøren er en nylig tilføjelse til familien af konstruktører i C++. Det er som en kopikonstruktør, der konstruerer objektet ud fra de allerede eksisterende objekter., men i stedet for at kopiere objektet i den nye hukommelse, gør den brug af flyttesemantik til at overføre ejerskabet af det allerede oprettede objekt til det nye objekt uden at skabe ekstra kopier.
Det kan ses som at stjæle ressourcerne fra andre objekter.
Syntaks for Move Constructor i C++
className (className&& obj) { // body of the constructor }> Det flytte konstruktør tager rværdi reference af objektet af samme klasse og overfører ejendomsretten til dette objekt til det nyoprettede objekt.
Ligesom en kopikonstruktør vil compileren oprette en flyttekonstruktør for hver klasse, der ikke har nogen eksplicit flyttekonstruktør.
Eksempler på Move Constructor
Eksemplerne nedenfor viser, hvordan man bruger move-konstruktørerne i C++.
Eksempel 1: Definition af 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;> }> |
>
gør mens java
>Produktion
Move Constructor Called newBox.data: 42>
Brug af Move Constructor
- I stedet for at lave kopier, overfører flyttekonstruktører effektivt ejerskabet af disse ressourcer.
- Dette forhindrer unødvendig hukommelseskopiering og reducerer overhead.
- Du kan definere din egen flyttekonstruktør til at håndtere specifikke ressourceoverførsler.
Destruktorer i C++
En destruktor er også en særlig medlemsfunktion som konstruktør. Destructor ødelægger klasseobjekterne skabt af konstruktøren. Destructor har samme navn som deres klassenavn efterfulgt af et tilde (~) symbol. Det er ikke muligt at definere mere end én destruktor. Destruktoren er kun én måde at ødelægge objektet skabt af konstruktøren. Destruktoren kan derfor ikke overbelastes. Destructor hverken kræver noget argument eller returnerer nogen værdi. Det kaldes automatisk, når objektet går uden for rækkevidde. Destruktorer frigiver hukommelsesplads optaget af de objekter, der er skabt af konstruktøren. I destroyer , bliver objekter ødelagt i det modsatte af objektskabelse.
Syntaks for destruktorer i C++
Ligesom konstruktører kan destruktorer også defineres enten i eller uden for klassen.
Syntaksen til at definere destruktoren i klassen
~ (){}> Syntaksen til at definere destruktoren uden for klassen
: : ~(){}> Eksempler på destruktorer i C++
Nedenstående eksempler viser, hvordan man bruger destruktorerne i C++.
Eksempel 1: Definition af en simpel destruktor
C++
#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>'
Constructor executed'>; }> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Produktion
Constructor executed Destructor executed>
Eksempel 2: At tælle antallet af gange, at objektet er oprettet 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;> }> |
>
>
Produktion
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>
Karakteristika for destruktorer i C++
Følgende er nogle hovedkarakteristika for destruktorer i C++:
- Destructor påkaldes automatisk af compileren, når dens tilsvarende konstruktør går uden for scope og frigiver den hukommelsesplads, der ikke længere kræves af programmet.
- Destructor hverken kræver noget argument eller returnerer nogen værdi, derfor kan den ikke overbelastes.
- Destructor kan ikke erklæres som statisk og const;
- Destructor skal erklæres i den offentlige del af programmet.
- Destructor kaldes i omvendt rækkefølge af dets konstruktør-invokation.
Ofte stillede spørgsmål om C++-konstruktører
Hvad er de funktioner, der genereres af compileren som standard, hvis vi ikke giver dem eksplicit?
De funktioner, der genereres af compileren som standard, hvis vi ikke eksplicit leverer dem, er:
- Standard konstruktør
- Kopi konstruktør
- Flyt konstruktører
- Opdragsoperatør
- Destroyer
Kan vi gøre konstruktørerne private?
Ja, i C++ kan konstruktører gøres private. Det betyder, at ingen ekstern kode direkte kan oprette et objekt af den pågældende klasse.
Hvordan adskiller konstruktører sig fra en normal medlemsfunktion?
En konstruktør er forskellig fra normale funktioner på følgende måder:
- Constructor har samme navn som klassen selv
- Standardkonstruktører har ikke input-argument, men Kopier og Parametriserede Konstruktører har input-argumenter
- Konstruktører har ikke returtype
- En konstruktør kaldes automatisk, når et objekt oprettes.
- Det skal placeres i den offentlige del af klassen.
- Hvis vi ikke angiver en konstruktør, genererer C++ compiler en standard konstruktør for objekt (forventer ingen parametre og har en tom krop).
Kan vi have mere end én konstruktør i en klasse?
Ja, vi kan have mere end én konstruktør i en klasse. Det kaldes Overbelastning af konstruktør .
Relaterede artikler:
- Destruktorer i C++
- Quiz om konstruktører i C++
- Output af C++ programmer | Sæt 26 (konstruktører)
- Output af C++ programmer | Sæt 27 (konstruktører og destruktorer)