Konstruktor v C++ je posebna metoda, ki se samodejno prikliče v času ustvarjanja objekta. Na splošno se uporablja za inicializacijo podatkovnih članov novih objektov. Konstruktor v C++ ima isto ime kot razred ali struktura. Konstruira vrednosti, tj. zagotavlja podatke za objekt, zato je znan kot konstruktor.
- Konstruktor je funkcija članica razreda, katere ime je enako imenu razreda.
- Konstruktor je posebna vrsta članske funkcije, ki se uporablja za samodejno inicializacijo podatkovnih članov za objekt razreda, ko je ustvarjen objekt istega razreda.
- Konstruktor se prikliče v času ustvarjanja objekta. Konstruira vrednosti, tj. zagotavlja podatke za objekt, zato je znan kot konstruktor.
- Konstruktorji ne vrnejo vrednosti, zato nimajo vrnjenega tipa.
- Konstruktor se samodejno pokliče, ko ustvarimo objekt razreda.
- Konstruktorji so lahko preobremenjeni.
- Konstruktorja ni mogoče razglasiti za navideznega.
Sintaksa konstruktorjev v C++
Prototip konstruktorja izgleda takole:
(list-of-parameters);>
Konstruktor je lahko definiran znotraj deklaracije razreda ali zunaj deklaracije razreda
Sintaksa za definiranje konstruktorja znotraj razreda
(list-of-parameters) { // constructor definition }> Sintaksa za definiranje konstruktorja zunaj razreda
: :(list-of-parameters) { // constructor definition }> Primeri konstruktorjev v C++
Spodnji primeri prikazujejo, kako deklarirati konstruktorje za razred v C++:
Primer 1: Definiranje konstruktorja znotraj razreda
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>> ime;> >cout <<>'Enter the Fee:'>;> >cin>> pristojbina;> >}> >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;> }> |
>
>
Izhod
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>
Primer 2: Definiranje konstruktorja zunaj razreda
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>> ime;> >cout <<>'Enter the Fee:'>;> >cin>> pristojbina;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }> |
>
>
Izhod
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>
Opomba: Konstruktor lahko definiramo zunaj razreda kot v vrsti da bo enakovreden definiciji v razredu. Vendar upoštevajte to v vrsti ni navodilo prevajalniku, je le zahteva, ki jo lahko prevajalnik izvede ali ne, odvisno od okoliščin.
Značilnosti konstruktorjev v C++
Sledi nekaj glavnih značilnosti konstruktorjev v C++:
- Ime konstruktorja je enako imenu njegovega razreda.
- Konstruktorji so večinoma deklarirani v javnem delu razreda, čeprav jih je mogoče deklarirati v zasebnem delu razreda.
- Konstruktorji ne vračajo vrednosti; zato nimajo povratne vrste.
- Konstruktor se samodejno pokliče, ko ustvarimo objekt razreda.
- Konstruktorji so lahko preobremenjeni.
- Konstruktorja ni mogoče razglasiti za navideznega.
- Konstruktorja ni mogoče podedovati.
- Naslovov izvajalca ni mogoče navesti.
- Konstruktor implicitno kliče novo in izbrisati operaterji med dodeljevanjem pomnilnika.
Vrste konstruktorjev v C++
Konstruktorje je mogoče razvrstiti glede na situacije, v katerih se uporabljajo. V C++ obstajajo 4 vrste konstruktorjev:
- Privzeti konstruktor
- Parametriziran konstruktor
- Konstruktor Kopiraj
- Konstruktor premika
Razumejmo vrste konstruktorjev v C++ na primeru iz resničnega sveta. Recimo, da ste šli v trgovino, da bi kupili marker. Ko želite kupiti marker, kakšne so možnosti? Prvi, ko greš v trgovino in rečeš, daj mi marker. Torej samo beseda daj mi marker pomeni, da niste določili imena blagovne znamke in katere barve, ničesar niste omenili, samo rekli ste, da želite marker. Torej, ko smo rekli samo hočem marker, ne glede na pogosto prodajan marker na trgu ali v njegovi trgovini, ga bo preprosto predal. In to je privzeti konstruktor!
Druga metoda je, da greš v trgovino in rečeš, da želim marker rdeče barve in znamke XYZ. Torej to omenjate in on vam bo dal ta marker. Torej ste v tem primeru podali parametre. In to je parametrizirani konstruktor!
Potem pa pri tretjem greš v trgovino in rečeš, da hočem tak marker (fizični marker na roki). Torej bo trgovec videl to oznako. V redu, in dal vam bo nov marker. Torej kopija tega markerja. In to je tisto, kar je konstruktor kopij!
Predpostavimo, da ne boste kupili novega markerja, ampak boste namesto tega prevzeli lastništvo nad markerjem svojega prijatelja. To pomeni prevzeti lastništvo nad že obstoječimi viri namesto pridobivanja novih. To je tisto, kar je konstruktor potez!
1. Privzeti konstruktor v C++
A privzeti konstruktor je konstruktor, ki ne sprejme nobenega argumenta. Nima parametrov. Imenuje se tudi konstruktor z ničelnimi argumenti.
Sintaksa privzetega konstruktorja
className() { // body_of_constructor }> Primeri privzetega konstruktorja
Spodnji primeri prikazujejo, kako uporabljati privzete konstruktorje v C++.
Primer 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;> }> |
>
>Izhod
a: 10 b: 20>
Opomba: Tudi če nobenega konstruktorja ne definiramo eksplicitno, bo prevajalnik implicitno samodejno zagotovil privzeti konstruktor.
Primer 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;> }> |
>
>
Izhod
(no output)>
Kot lahko vidimo, lahko objekt razreda student ustvarimo brez posredovanja argumentov, tudi če zanj nismo definirali nobenega eksplicitnega privzetega konstruktorja.
2. Parametrizirani konstruktor v C++
Parametrirani konstruktorji omogočajo posredovanje argumentov konstruktorjem. Običajno ti argumenti pomagajo pri inicializaciji predmeta, ko je ustvarjen. Če želite ustvariti parametriran konstruktor, mu preprosto dodajte parametre, kot bi jih dodali kateri koli drugi funkciji. Ko definirate telo konstruktorja, uporabite parametre za inicializacijo predmeta.
Sintaksa parametriziranega konstruktorja
className (parameters...) { // body }> Primeri parametriziranega konstruktorja
Spodnji primeri prikazujejo, kako uporabljati parametrizirane konstruktorje v C++.
Primer 1: Definiranje parametriziranega konstruktorja znotraj razreda.
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;> }> |
>
>Izhod
p1.x = 10, p1.y = 15>
Primer 2: Definiranje parametriziranega konstruktorja zunaj razreda.
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;> }> |
>
>Izhod
1001 Ram 10000>
Ko je objekt deklariran v parametriziranem konstruktorju, je treba začetne vrednosti posredovati kot argumente funkciji konstruktorja. Običajni način deklaracije objekta morda ne bo deloval. Parametrizirane konstruktorje je mogoče klicati eksplicitno ali implicitno:
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
Ko je parametriran konstruktor definiran in noben privzeti konstruktor ni definiran izrecno, prevajalnik ne bo implicitno ustvaril privzetega konstruktorja in s tem ustvaril preprostega predmeta kot:
Student s;>
utripa napaka.
Primer 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;> }> |
>
>
Izhod
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 ^~> Pomembna opomba: Kadarkoli definiramo enega ali več neprivzetih konstruktorjev (s parametri) za razred, je treba izrecno definirati tudi privzeti konstruktor (brez parametrov), saj prevajalnik v tem primeru ne bo zagotovil privzetega konstruktorja. Vendar ni nujno, vendar velja, da je najboljša praksa, da vedno definirate privzeti konstruktor.
Uporaba parametriziranega konstruktorja
- Uporablja se za inicializacijo različnih podatkovnih elementov različnih objektov z različnimi vrednostmi, ko so ustvarjeni.
- Uporablja se za preobremenitev konstruktorjev.
Privzeti argumenti s parametriziranim konstruktorjem C++
Tako kot običajne funkcije lahko tudi za argumente parametriziranih konstruktorjev definiramo privzete vrednosti. Vsa pravila v privzeti argumenti bodo uporabljeni za te parametre.
Primer 3: Definiranje parametriziranega konstruktorja s privzetimi vrednostmi
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;> }> |
>
>Izhod
First Object Data: 0 Second Object Data: 25>
Kot lahko vidimo, ko so privzete vrednosti dodeljene vsakemu argumentu parametriziranega konstruktorja, je zakonito ustvariti objekt brez posredovanja parametrov, tako kot privzeti konstruktorji. Ta vrsta konstruktorja torej deluje kot privzeti in kot parametrirani konstruktor.
3. Copy Constructor v C++
Konstruktor kopiranja je funkcija članica, ki inicializira objekt z uporabo drugega objekta istega razreda.
Sintaksa Konstruktor Kopiraj
Konstruktor za kopiranje kot argument sprejme sklic na objekt istega razreda.
ClassName (ClassName &obj) { // body_containing_logic }> Tako kot privzeti konstruktor tudi prevajalnik C++ nudi implicitni konstruktor kopiranja, če definicija eksplicitnega konstruktorja kopiranja ni prisotna. Tu je treba opozoriti, da bo za razliko od privzetega konstruktorja, kjer prisotnost katere koli vrste eksplicitnega konstruktorja povzroči izbris implicitnega privzetega konstruktorja, implicitni konstruktor kopije vedno ustvaril prevajalnik, če ni eksplicitnega konstruktorja kopije ali je prisoten eksplicitni konstruktor premika.
Primeri Konstruktorja kopiranja
Spodnji primeri prikazujejo, kako uporabljati konstruktorje kopiranja v C++.
Primer 1: ilustracija implicitnega konstruktorja kopiranja
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;> }> |
>
>
mreža numpyIzhod
ID=10 ID=10>
Primer 2: Definiranje eksplicitnega konstruktorja kopiranja
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;> }> |
>
>Izhod
ID=10 ID=10>
Primer 3: Definiranje eksplicitnega konstruktorja kopiranja s parametriziranim konstruktorjem
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;> }> |
>
>Izhod
1001 Manjeet 10000 1001 Manjeet 10000>
Uporaba Konstruktorja kopiranja
- Konstruira nov objekt s kopiranjem vrednosti iz obstoječega predmeta.
- Lahko se uporablja za izvedbo globokega kopiranja.
- Po potrebi spremenite določene atribute med postopkom kopiranja.
4. Premakni konstruktor v C++
Konstruktor premikanja je nov dodatek k družini konstruktorjev v C++. Je kot konstruktor kopiranja, ki sestavi objekt iz že obstoječih objektov., vendar namesto kopiranja predmeta v novem pomnilniku uporablja semantiko premikanja za prenos lastništva že ustvarjenega objekta na nov objekt brez ustvarjanja dodatnega izvodov.
Na to lahko gledamo kot na krajo virov iz drugih predmetov.
Sintaksa konstruktorja premika v C++
className (className&& obj) { // body of the constructor }> The premikanje konstruktorja vzame referenca rvalue objekta istega razreda in prenese lastništvo tega objekta na novonastali objekt.
Tako kot kopirni konstruktor bo prevajalnik ustvaril premikalni konstruktor za vsak razred, ki nima eksplicitnega premikalnega konstruktorja.
Primeri konstruktorja premika
Spodnji primeri prikazujejo, kako uporabljati konstruktorje premikanja v C++.
Primer 1: Definiranje konstruktorja premika
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;> }> |
>
>Izhod
Move Constructor Called newBox.data: 42>
Uporaba Move Constructorja
- Namesto izdelovanja kopij konstruktorji premika učinkovito prenesejo lastništvo teh virov.
- To prepreči nepotrebno kopiranje pomnilnika in zmanjša stroške.
- Definirate lahko svoj lasten konstruktor premika za obravnavo specifičnih prenosov virov.
Destruktorji v C++
Destruktor je tudi posebna funkcija člana kot konstruktor. Destructor uniči objekte razreda, ki jih je ustvaril konstruktor. Destructor ima isto ime kot ime razreda, pred katerim je simbol tilde (~). Ni mogoče definirati več kot enega destruktorja. Destruktor je le eden od načinov za uničenje predmeta, ki ga je ustvaril konstruktor. Zato destruktorja ni mogoče preobremeniti. Destructor ne zahteva nobenega argumenta niti ne vrne nobene vrednosti. Samodejno se pokliče, ko gre objekt izven obsega. Destruktorji sprostijo pomnilniški prostor, ki ga zasedajo objekti, ki jih je ustvaril konstruktor. noter rušilec , so predmeti uničeni v obratni smeri od ustvarjanja predmeta.
Sintaksa destruktorjev v C++
Tako kot konstruktorje lahko tudi destruktorje definiramo znotraj ali zunaj razreda.
Sintaksa za definiranje destruktorja znotraj razreda
~ (){}> Sintaksa za definiranje destruktorja zunaj razreda
: : ~(){}> Primeri destruktorjev v C++
Spodnji primeri prikazujejo, kako uporabljati destruktorje v C++.
Primer 1: Definiranje preprostega destruktorja
C++
#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>'
Constructor executed'>; }> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Izhod
Constructor executed Destructor executed>
2. primer: štetje, kolikokrat je bil predmet ustvarjen in uničen
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;> }> |
>
>
Izhod
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>
Značilnosti destruktorjev v C++
Sledi nekaj glavnih značilnosti destruktorjev v C++:
- Prevajalnik samodejno pokliče destructor, ko njegov ustrezni konstruktor izstopi iz obsega in sprosti pomnilniški prostor, ki ga program ne potrebuje več.
- Destructor ne zahteva nobenega argumenta niti ne vrne nobene vrednosti, zato ga ni mogoče preobremeniti.
- Destructorja ni mogoče razglasiti kot statičnega in const;
- Destructor je treba prijaviti v javnem delu programa.
- Destructor se kliče v obratnem vrstnem redu kot priklic njegovega konstruktorja.
Pogosto zastavljena vprašanja o konstruktorjih C++
Katere so funkcije, ki jih privzeto generira prevajalnik, če jih ne zagotovimo izrecno?
Funkcije, ki jih privzeto generira prevajalnik, če jih ne zagotovimo izrecno, so:
- Privzeti konstruktor
- Konstruktor Kopiraj
- Konstruktorji premikanja
- Operater dodelitve
- Uničevalec
Ali lahko konstruktorje naredimo zasebne?
Da, v C++ so lahko konstruktorji zasebni. To pomeni, da nobena zunanja koda ne more neposredno ustvariti objekta tega razreda.
Kako se konstruktorji razlikujejo od običajne funkcije člana?
Konstruktor se od običajnih funkcij razlikuje na naslednje načine:
- Konstruktor ima isto ime kot sam razred
- Privzeti konstruktorji nimajo vhodnih argumentov, vendar imajo kopiranje in parametrirani konstruktorji vhodne argumente
- Konstruktorji nimajo povratnega tipa
- Ko je predmet ustvarjen, se samodejno pokliče konstruktor.
- Postaviti ga je treba v javni del razreda.
- Če ne podamo konstruktorja, prevajalnik C++ ustvari privzeti konstruktor za objekt (ne pričakuje parametrov in ima prazno telo).
Ali lahko imamo več kot enega konstruktorja v razredu?
Da, v razredu imamo lahko več kot enega konstruktorja. Se imenuje Preobremenitev konstruktorja .
Povezani članki:
- Destruktorji v C++
- Kviz o konstruktorjih v C++
- Izhod programov C++ | Komplet 26 (Konstruktorji)
- Izhod programov C++ | Komplet 27 (konstruktorji in destruktorji)