Konstruktör i C++ är en speciell metod som anropas automatiskt när objektet skapas. Det används för att initiera datamedlemmarna för nya objekt i allmänhet. Konstruktorn i C++ har samma namn som klassen eller strukturen. Den konstruerar värdena, dvs tillhandahåller data för objektet, vilket är anledningen till att det är känt som en konstruktor.
hashbar java
- Constructor är en medlemsfunktion i en klass, vars namn är detsamma som klassnamnet.
- Constructor är en speciell typ av medlemsfunktion som används för att initiera datamedlemmarna för ett objekt i en klass automatiskt när ett objekt av samma klass skapas.
- Konstruktör anropas när objektet skapas. Den konstruerar värdena, dvs tillhandahåller data för objektet, det är därför det är känt som en konstruktor.
- Konstruktörer returnerar inget värde, därför har de ingen returtyp.
- En konstruktor anropas automatiskt när vi skapar objektet i klassen.
- Konstruktörer kan bli överbelastade.
- En konstruktor kan inte deklareras som virtuell.
Syntax för konstruktörer i C++
Prototypen av konstruktören ser ut så här:
(list-of-parameters);>
Konstruktorn kan definieras inuti klassdeklarationen eller utanför klassdeklarationen
Syntax för att definiera konstruktören inom klassen
(list-of-parameters) { // constructor definition }> Syntax för att definiera konstruktören utanför klassen
: :(list-of-parameters) { // constructor definition }> Exempel på konstruktörer i C++
Exemplen nedan visar hur man deklarerar konstruktörer för en klass i C++:
Exempel 1: Definiera konstruktören inom 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>> namn;> >cout <<>'Enter the Fee:'>;> >cin>> avgift;> >}> >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>
Exempel 2: Definiera konstruktören utanför 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>> namn;> >cout <<>'Enter the Fee:'>;> >cin>> avgift;> }> 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>
Notera: Vi kan göra konstruktorn definierad utanför klassen som i kö för att göra den likvärdig med definitionen i klassen. Men notera det i kö är inte en instruktion till kompilatorn, det är bara den begäran som kompilatorn kan eller inte kan implementera beroende på omständigheterna.
Egenskaper för konstruktörer i C++
Följande är några huvudegenskaper hos konstruktörerna i C++:
- Namnet på konstruktören är detsamma som dess klassnamn.
- Konstruktörer deklareras oftast i den offentliga delen av klassen men de kan deklareras i den privata delen av klassen.
- Konstruktörer returnerar inte värden; därför har de ingen returtyp.
- En konstruktor anropas automatiskt när vi skapar objektet i klassen.
- Konstruktörer kan bli överbelastade.
- En konstruktor kan inte deklareras som virtuell.
- En konstruktor kan inte ärvas.
- Adresserna till konstruktören kan inte hänvisas till.
- Konstruktören gör implicita anrop till ny och radera operatörer under minnesallokering.
Typer av konstruktörer i C++
Konstruktörer kan klassificeras utifrån i vilka situationer de används. Det finns fyra typer av konstruktörer i C++:
- Standardkonstruktör
- Parameteriserad konstruktör
- Kopiera konstruktör
- Flytta konstruktör
Låt oss förstå typerna av konstruktörer i C++ genom att ta ett exempel från verkligheten. Anta att du gick till en butik för att köpa en markör. När du vill köpa en markör, vad finns det för alternativ? Den första går du till en butik och säger ge mig en markör. Så bara att säga ge mig en markör betyder att du inte har angett vilket varumärke och vilken färg, du nämnde ingenting bara att du vill ha en markör. Så när vi sa att jag bara vill ha en markör oavsett vad den ofta sålda markören finns på marknaden eller hans butik kommer han helt enkelt att lämna över den. Och det här är vad en standardkonstruktör är!
Den andra metoden är att du går till en butik och säger att jag vill ha en röd markör och XYZ-märke. Så du nämner detta och han kommer att ge dig den markören. Så i det här fallet har du angett parametrarna. Och detta är vad en parametriserad konstruktör är!
Sedan den tredje går du till en butik och säger att jag vill ha en sådan här markör (en fysisk markör på handen). Så butiksinnehavaren kommer att se den markören. Okej, och han kommer att ge dig en ny markör. Så kopia av den markören. Och det är vad en kopieringskonstruktör är!
Antag nu att du inte köper en ny markör utan istället tar äganderätten till din väns markör. Det innebär att ta ägarskap av redan befintliga resurser istället för att skaffa en ny. Det är vad en flyttkonstruktör är!
1. Standardkonstruktör i C++
A standardkonstruktör är en konstruktör som inte tar några argument. Den har inga parametrar. Det kallas också en nollargumentkonstruktor.
Syntax för Default Constructor
className() { // body_of_constructor }> Exempel på Default Constructor
Exemplen nedan visar hur man använder standardkonstruktörerna i C++.
Exempel 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>
Notera: Även om vi inte definierar någon konstruktor explicit, kommer kompilatorn automatiskt att tillhandahålla en standardkonstruktor implicit.
Exempel 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 kan vi skapa klassstudentobjekt utan att skicka några argument även när vi inte har definierat någon explicit standardkonstruktor för det.
2. Parameteriserad konstruktör i C++
Parameteriserade konstruktörer gör det möjligt att skicka argument till konstruktörer. Vanligtvis hjälper dessa argument att initiera ett objekt när det skapas. För att skapa en parametriserad konstruktor, lägg helt enkelt till parametrar till den på samma sätt som du skulle göra för alla andra funktioner. När du definierar konstruktorns kropp, använd parametrarna för att initiera objektet.
Syntax för Parameterized Constructor
className (parameters...) { // body }> Exempel på parametriserad konstruktör
Exemplen nedan visar hur man använder de parametriserade konstruktörerna i C++.
Exempel 1: Definiera parametriserad konstruktör inuti 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>
Exempel 2: Definiera parametriserad konstruktör utanför klassen.
C++
mysql list användare
// 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 ett objekt deklareras i en parametriserad konstruktor måste de initiala värdena skickas som argument till konstruktorfunktionen. Det vanliga sättet för objektdeklaration kanske inte fungerar. De parametriserade konstruktörerna kan anropas explicit eller implicit:
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
När den parametriserade konstruktorn är definierad och ingen standardkonstruktor är definierad explicit, kommer kompilatorn inte implicit att skapa standardkonstruktorn och därmed skapa ett enkelt objekt som:
Student s;>
kommer att blinka ett fel.
Exempel 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;> }> |
>
>
arraylist i java
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 ^~> Viktig notering: Närhelst vi definierar en eller flera icke-standardkonstruktorer (med parametrar) för en klass, bör en standardkonstruktor (utan parametrar) också uttryckligen definieras eftersom kompilatorn inte kommer att tillhandahålla en standardkonstruktor i detta fall. Det är dock inte nödvändigt men det anses vara den bästa praxisen att alltid definiera en standardkonstruktor.
Användning av Parameterized Constructor
- Den används för att initiera de olika dataelementen för olika objekt med olika värden när de skapas.
- Det används för att överbelasta konstruktörer.
Standardargument med C++ Parameterized Constructor
Precis som vanliga funktioner kan vi också definiera standardvärden för argumenten för parameteriserade konstruktorer. Alla regler för standardargument kommer att tillämpas på dessa parametrar.
Exempel 3: Definiera parametriserad konstruktör med standardvärden
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;> }> |
>
>Produktion
First Object Data: 0 Second Object Data: 25>
Som vi kan se, när standardvärdena tilldelas varje argument i den parametriserade konstruktorn, är det lagligt att skapa objektet utan att skicka några parametrar precis som standardkonstruktorer. Så den här typen av konstruktorer fungerar både som en standardkonstruktor och en parameterinställd konstruktor.
3. Kopiera Constructor i C++
En kopieringskonstruktor är en medlemsfunktion som initierar ett objekt med ett annat objekt av samma klass.
Syntax för Kopiera konstruktör
Kopiera konstruktör tar en referens till ett objekt av samma klass som ett argument.
ClassName (ClassName &obj) { // body_containing_logic }> Precis som standardkonstruktorn tillhandahåller C++-kompilatorn också en implicit kopiakonstruktor om den explicita kopiakonstruktordefinitionen inte finns. Här bör det noteras att, till skillnad från standardkonstruktorn där närvaron av någon typ av explicit konstruktor resulterar i att den implicita standardkonstruktorn raderas, kommer den implicita kopiakonstruktorn alltid att skapas av kompilatorn om det inte finns någon explicit kopiakonstruktor eller explicit rörelsekonstruktor finns.
Exempel på Copy Constructor
Exemplen nedan visar hur man använder kopieringskonstruktörerna i C++.
Exempel 1: Illustration 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;> }> |
>
array i java
>Produktion
ID=10 ID=10>
Exempel 2: Definition av Explicit Copy Constructor
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>
Exempel 3: Definition av Explicit Copy Constructor med Parameterized Constructor
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>
Användning av Copy Constructor
- Konstruerar ett nytt objekt genom att kopiera värden från ett befintligt objekt.
- Kan användas för att utföra djupkopiering.
- Ändra specifika attribut under kopieringsprocessen om det behövs.
4. Flytta Constructor i C++
Flyttkonstruktören är ett nyligen tillägg till familjen av konstruktörer i C++. Det är som en kopieringskonstruktör som konstruerar objektet från de redan befintliga objekten., men istället för att kopiera objektet i det nya minnet, använder den sig av flyttsemantik för att överföra ägandet av det redan skapade objektet till det nya objektet utan att skapa extra kopior.
Det kan ses som att man stjäl resurserna från andra föremål.
Syntax för Move Constructor i C++
className (className&& obj) { // body of the constructor }> De flytta konstruktör tar rvärde referens av objektet i samma klass och överför äganderätten till detta objekt till det nyskapade objektet.
Liksom en kopieringskonstruktor kommer kompilatorn att skapa en flyttkonstruktor för varje klass som inte har någon explicit flyttkonstruktor.
Exempel på Move Constructor
Exemplen nedan visar hur man använder rörelsekonstruktörerna i C++.
Exempel 1: Definiera Move Constructor
C++
ubuntu build väsentligheter
// 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;> }> |
>
>Produktion
Move Constructor Called newBox.data: 42>
Användning av Move Constructor
- Istället för att göra kopior överför flyttkonstruktörer effektivt ägandet av dessa resurser.
- Detta förhindrar onödig minneskopiering och minskar omkostnader.
- Du kan definiera din egen flyttkonstruktor för att hantera specifika resursöverföringar.
Destruktörer i C++
En destruktör är också en speciell medlemsfunktion som konstruktör. Destructor förstör klassobjekten som skapats av konstruktorn. Destructor har samma namn som deras klassnamn föregås av en tilde (~) symbol. Det är inte möjligt att definiera mer än en förstörare. Destruktorn är bara ett sätt att förstöra objektet som skapats av konstruktören. Därför kan destruktorn inte överbelastas. Destructor varken kräver något argument eller returnerar något värde. Det anropas automatiskt när objektet går utanför räckvidden. Destruktörer frigör minnesutrymme som upptas av objekten som skapats av konstruktören. I jagare , objekt förstörs i motsatt riktning av objektskapande.
Syntax för förstörare i C++
Precis som konstruktörer kan destruktörer också definieras antingen inom eller utanför klassen.
Syntaxen för att definiera destruktorn inom klassen
~ (){}> Syntaxen för att definiera destruktorn utanför klassen
: : ~(){}> Exempel på destruktörer i C++
Exemplen nedan visar hur man använder destruktörerna i C++.
Exempel 1: Definiera en enkel 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>
Exempel 2: Räkna hur många gånger objekt skapas och förstörs
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>
Egenskaper för destruktörer i C++
Följande är några huvudegenskaper hos destruktörer i C++:
- Destructor anropas automatiskt av kompilatorn när dess motsvarande konstruktor går utanför räckvidden och frigör minnesutrymmet som inte längre krävs av programmet.
- Destructor varken kräver något argument eller returnerar något värde, därför kan den inte överbelastas.
- Destructor kan inte deklareras som statisk och const;
- Destructor bör deklareras i den offentliga delen av programmet.
- Destructor anropas i omvänd ordning av dess konstruktoranrop.
Vanliga frågor om C++-konstruktörer
Vilka är de funktioner som genereras av kompilatorn som standard, om vi inte tillhandahåller dem explicit?
Funktionerna som genereras av kompilatorn som standard om vi inte tillhandahåller dem uttryckligen är:
- Standardkonstruktör
- Kopiera konstruktör
- Flytta konstruktörer
- Uppdragsoperatör
- Jagare
Kan vi göra konstruktörerna privata?
Ja, i C++ kan konstruktörer göras privata. Det betyder att ingen extern kod direkt kan skapa ett objekt av den klassen.
Hur skiljer sig konstruktörer från en normal medlemsfunktion?
En konstruktor skiljer sig från normala funktioner på följande sätt:
- Constructor har samma namn som klassen själv
- Standardkonstruktörer har dock inte inmatningsargument, Kopiera och Parameteriserade konstruktörer har inmatningsargument
- Konstruktörer har ingen returtyp
- En konstruktor anropas automatiskt när ett objekt skapas.
- Den måste placeras i den offentliga delen av klassen.
- Om vi inte anger en konstruktor, genererar C++-kompilatorn en standardkonstruktor för objekt (förväntar sig inga parametrar och har en tom kropp).
Kan vi ha mer än en konstruktör i en klass?
Ja, vi kan ha mer än en konstruktör i en klass. Det kallas Konstruktör överbelastning .
Relaterade artiklar:
- Destruktörer i C++
- Frågesport om konstruktörer i C++
- Utdata från C++-program | Set 26 (konstruktörer)
- Utdata från C++-program | Set 27 (konstruktörer och destruktörer)