logo

Konštruktory v C++

Konštruktor v C++ je špeciálna metóda, ktorá sa vyvoláva automaticky pri vytváraní objektu. Vo všeobecnosti sa používa na inicializáciu dátových členov nových objektov. Konštruktor v C++ má rovnaký názov ako trieda alebo štruktúra. Konštruuje hodnoty, t. j. poskytuje údaje pre objekt, a preto je známy ako konštruktor.

  • Konštruktor je členská funkcia triedy, ktorej názov je rovnaký ako názov triedy.
  • Konštruktor je špeciálny typ členskej funkcie, ktorá sa používa na automatickú inicializáciu dátových členov pre objekt triedy, keď je vytvorený objekt rovnakej triedy.
  • Konštruktor je vyvolaný v čase vytvárania objektu. Konštruuje hodnoty, t. j. poskytuje údaje pre objekt, preto je známy ako konštruktor.
  • Konštruktory nevracajú hodnotu, preto nemajú návratový typ.
  • Konštruktor sa zavolá automaticky, keď vytvoríme objekt triedy.
  • Konštruktory môžu byť preťažené.
  • Konštruktor nemôže byť vyhlásený za virtuálny.

Syntax konštruktorov v C++

Prototyp konštruktora vyzerá takto:

 (list-of-parameters);>

Konštruktor môže byť definovaný vo vnútri deklarácie triedy alebo mimo deklarácie triedy



Syntax na definovanie konštruktora v rámci triedy

 (list-of-parameters) {     // constructor definition  }>

Syntax pre definovanie konštruktora mimo triedy

: :(list-of-parameters) {    // constructor definition  }>

Príklady konštruktérov v C++

Nižšie uvedené príklady ukazujú, ako deklarovať konštruktory pre triedu v C++:

Príklad 1: Definovanie konštruktora v rámci triedy

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>> meno;> >cout <<>'Enter the Fee:'>;> >cin>> poplatok;> >}> >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;> }>

>

>

Výkon

Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>

Príklad 2: Definovanie konštruktora mimo triedy

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>> meno;> >cout <<>'Enter the Fee:'>;> >cin>> poplatok;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }>

>

>

výpis java

Výkon

Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>

Poznámka: Môžeme urobiť konštruktor definovaný mimo triedy ako v rade aby to bolo ekvivalentné s definíciou v triede. Ale všimnite si to v rade nie je pokyn pre kompilátor, je to len požiadavka, ktorú kompilátor môže alebo nemusí implementovať v závislosti od okolností.

Charakteristika konštruktorov v C++

Nasledujú niektoré hlavné charakteristiky konštruktorov v C++:

  • Názov konštruktora je rovnaký ako názov jeho triedy.
  • Konštruktory sú väčšinou deklarované vo verejnej časti triedy, hoci môžu byť deklarované v súkromnej časti triedy.
  • Konštruktory nevracajú hodnoty; preto nemajú návratový typ.
  • Konštruktor sa zavolá automaticky, keď vytvoríme objekt triedy.
  • Konštruktory môžu byť preťažené.
  • Konštruktor nemôže byť vyhlásený za virtuálny.
  • Konštruktor sa nedá zdediť.
  • Nie je možné odvolávať sa na adresy Konštruktéra.
  • Konštruktor vykonáva implicitné volania na Nový a vymazať operátorov počas prideľovania pamäte.

Typy konštruktorov v C++

Konštruktory možno klasifikovať podľa toho, v akých situáciách sa používajú. V C++ existujú 4 typy konštruktorov:

  1. Predvolený konštruktor
  2. Parametrizovaný konštruktor
  3. Kopírovať konštruktor
  4. Move Constructor

Poďme pochopiť typy konštruktorov v C++ na príklade z reálneho sveta. Predpokladajme, že ste išli do obchodu kúpiť fixku. Keď si chcete kúpiť fixku, aké sú možnosti? Prvý idete do obchodu a poviete, dajte mi fixku. Takže len to, že poviete, dajte mi značku, znamená, že ste nenastavili názov značky a farbu, nič ste nespomenuli, len ste povedali, že chcete značku. Takže keď sme povedali, že chcem fixku bez ohľadu na často predávanú fixku na trhu alebo vo svojom obchode, jednoducho mi ju odovzdá. A toto je predvolený konštruktor!

Druhý spôsob je, že pôjdete do obchodu a poviete, že chcem fixku červenej farby a značky XYZ. Takže to spomínate a on vám dá tú značku. V tomto prípade ste teda uviedli parametre. A toto je parametrizovaný konštruktor!

Potom s tretím idete do obchodu a poviete, že chcem takúto značku (fyzickú značku na ruke). Takže obchodník uvidí tú značku. Dobre, a dá vám novú značku. Takže skopírujte tú značku. A to je to, čo je konštruktor kópií!

Teraz predpokladajme, že si nekúpite novú značku, ale namiesto toho prevezmete vlastníctvo značky svojho priateľa. Znamená to prevziať vlastníctvo už existujúcich zdrojov namiesto získavania nových. To je konštruktor pohybu!

1. Predvolený konštruktor v C++

A predvolený konštruktor je konštruktér, ktorý neberie žiadne argumenty. Nemá žiadne parametre. Nazýva sa tiež konštruktor s nulovým argumentom.

Syntax predvoleného konštruktora

className() {     // body_of_constructor  }>

Príklady predvoleného konštruktora

Nižšie uvedené príklady demonštrujú, ako používať predvolené konštruktory v C++.

Príklad 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;> }>

>

>

Výkon

a: 10 b: 20>

Poznámka: Aj keď explicitne nedefinujeme žiadny konštruktor, kompilátor automaticky implicitne poskytne predvolený konštruktor.

Príklad 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;> }>

>

>

Výkon

(no output)>

Ako vidíme, dokážeme vytvoriť objekt študenta triedy bez zadania akéhokoľvek argumentu, aj keď sme preň nedefinovali žiadny explicitný predvolený konštruktor.

2. Parametrizovaný konštruktor v C++

Parametrizované konštruktory umožňujú odovzdávať argumenty konštruktorom. Tieto argumenty zvyčajne pomáhajú inicializovať objekt pri jeho vytvorení. Ak chcete vytvoriť parametrizovaný konštruktor, jednoducho k nemu pridajte parametre tak, ako by ste to urobili pri akejkoľvek inej funkcii. Keď definujete telo konštruktora, použite parametre na inicializáciu objektu.

Syntax parametrizovaného konštruktora

className (parameters...) {     // body  }>

Príklady parametrizovaného konštruktora

Nižšie uvedené príklady ukazujú, ako používať parametrizované konštruktory v C++.

Príklad 1: Definovanie parametrizovaného konštruktora vo vnútri triedy.

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;> }>

>

>

Výkon

p1.x = 10, p1.y = 15>

Príklad 2: Definovanie parametrizovaného konštruktora mimo triedy.

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;> }>

>

>

Výkon

1001 Ram 10000>

Keď je objekt deklarovaný v parametrizovanom konštruktore, počiatočné hodnoty sa musia odovzdať ako argumenty funkcii konštruktora. Bežný spôsob deklarácie objektu nemusí fungovať. Parametrizované konštruktory možno volať explicitne alebo implicitne:

Example e = Example(0, 50);   // Explicit call  Example e(0, 50);    // Implicit call>

Keď je definovaný parametrizovaný konštruktor a nie je explicitne definovaný žiadny predvolený konštruktor, kompilátor implicitne nevytvorí predvolený konštruktor, a teda nevytvorí jednoduchý objekt ako:

Student s;>

bude blikať chyba.

Príklad 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;> }>

>

>

Výkon

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 ^~>

Dôležitá poznámka: Kedykoľvek definujeme jeden alebo viac neštandardných konštruktorov (s parametrami) pre triedu, mal by byť explicitne definovaný aj predvolený konštruktor (bez parametrov), pretože kompilátor v tomto prípade neposkytne predvolený konštruktor. Nie je to však nevyhnutné, ale považuje sa za najlepší postup vždy definovať predvolený konštruktor.

Použitie parametrizovaného konštruktora

  • Používa sa na inicializáciu rôznych dátových prvkov rôznych objektov s rôznymi hodnotami pri ich vytváraní.
  • Používa sa na preťaženie konštruktérov.

Predvolené argumenty s parametrizovaným konštruktorom C++

Rovnako ako normálne funkcie môžeme definovať aj predvolené hodnoty pre argumenty parametrizovaných konštruktorov. Všetky pravidlá predvolené argumenty budú aplikované na tieto parametre.

Príklad 3: Definovanie parametrizovaného konštruktora s predvolenými hodnotami

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;> }>

>

>

Výkon

First Object Data: 0 Second Object Data: 25>

Ako môžeme vidieť, keď sú predvolené hodnoty priradené ku každému argumentu parametrizovaného konštruktora, je legálne vytvoriť objekt bez odovzdania akýchkoľvek parametrov, rovnako ako predvolené konštruktory. Tento typ konštruktora teda funguje ako predvolený aj parametrizovaný konštruktor.

3. Skopírujte konštruktor v C++

Kopírovací konštruktor je členská funkcia, ktorá inicializuje objekt pomocou iného objektu rovnakej triedy.

Syntax of Kopírovať konštruktor

Kopírovať konštruktor berie ako argument odkaz na objekt rovnakej triedy.

ClassName (ClassName &obj) {    // body_containing_logic  }>

Rovnako ako predvolený konštruktor, aj kompilátor C++ poskytuje implicitný konštruktor kópie, ak nie je prítomná explicitná definícia konštruktora kópie. Tu je potrebné poznamenať, že na rozdiel od predvoleného konštruktora, kde prítomnosť akéhokoľvek typu explicitného konštruktora vedie k vymazaniu implicitného predvoleného konštruktora, konštruktor implicitnej kópie bude vždy vytvorený kompilátorom, ak neexistuje explicitný konštruktor kópie. alebo je prítomný explicitný konštruktor presunu.

Príklady Copy Constructor

Nižšie uvedené príklady demonštrujú, ako používať kopírovacie konštruktory v C++.

Príklad 1: Ilustrácia implicitného kopírovacieho konštruktora

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;> }>

>

>

Výkon

ID=10 ID=10>

Príklad 2: Definovanie konštruktora explicitných kópií

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;> }>

>

zoznam používateľov mysql
>

Výkon

ID=10 ID=10>

Príklad 3: Definovanie explicitného kopírovacieho konštruktora s parametrizovaným konštruktorom

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;> }>

>

>

Výkon

1001 Manjeet 10000 1001 Manjeet 10000>

Použitie nástroja Copy Constructor

  • Vytvorí nový objekt skopírovaním hodnôt z existujúceho objektu.
  • Môže sa použiť na vykonanie hlbokého kopírovania.
  • V prípade potreby upravte špecifické atribúty počas procesu kopírovania.

4. Presuňte konštruktor v C++

Konštruktor presunu je nedávnym prírastkom do rodiny konštruktorov v C++. Je to ako konštruktor kópie, ktorý vytvára objekt z už existujúcich objektov, ale namiesto kopírovania objektu v novej pamäti využíva sémantiku presunu na prenos vlastníctva už vytvoreného objektu na nový objekt bez vytvárania ďalších objektov. kópie.

Možno to považovať za kradnutie zdrojov z iných objektov.

Syntax konštruktora pohybu v C++

className (className&& obj) {    // body of the constructor  }>

The presunúť konštruktor berie referencia rvalue objektu rovnakej triedy a prevedie vlastníctvo tohto objektu na novovytvorený objekt.

Podobne ako konštruktor kópie, kompilátor vytvorí konštruktor presunu pre každú triedu, ktorá nemá žiadny explicitný konštruktor presunu.

Príklady konštruktora pohybu

Nižšie uvedené príklady ukazujú, ako používať konštruktory presunu v C++.

Príklad 1: Definovanie konštruktora pohybu

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;> }>

>

>

Výkon

Move Constructor Called newBox.data: 42>

Použitie konštruktora pohybu

  • Namiesto vytvárania kópií presúvajte konštruktérov efektívnym prevodom vlastníctva týchto zdrojov.
  • Tým sa zabráni zbytočnému kopírovaniu pamäte a zníži sa réžia.
  • Môžete definovať svoj vlastný konštruktor presunu na spracovanie konkrétnych prenosov prostriedkov.

Deštruktory v C++

Deštruktor je tiež špeciálna členská funkcia ako konštruktor. Deštruktor zničí objekty triedy vytvorené konštruktorom. Deštruktor má rovnaký názov ako názov ich triedy, pred ktorým je symbol vlnovky (~). Nie je možné definovať viac ako jeden deštruktor. Deštruktor je len jedným zo spôsobov, ako zničiť objekt vytvorený konštruktorom. Deštruktor teda nemôže byť preťažený. Deštruktor nevyžaduje žiadny argument ani nevracia žiadnu hodnotu. Volá sa automaticky, keď objekt prekročí rozsah. Deštruktory uvoľňujú pamäťový priestor obsadený objektmi vytvorenými konštruktorom. In ničiteľ , objekty sú zničené v opačnom poradí ako pri vytváraní objektov.

Syntax deštruktorov v C++

Podobne ako konštruktory, aj deštruktory môžu byť definované buď vnútri alebo mimo triedy.

Syntax na definovanie deštruktora v rámci triedy

~ (){}>

Syntax na definovanie deštruktora mimo triedy

: : ~(){}>

Príklady deštruktorov v C++

Nižšie uvedené príklady ukazujú, ako používať deštruktory v C++.

Príklad 1: Definovanie jednoduchého deštruktora

C++




#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>' Constructor executed'>; }> >~Test() { cout <<>' Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }>

>

>

Výkon

 Constructor executed Destructor executed>

Príklad 2: Počítanie, koľkokrát bol objekt vytvorený a znič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;> }>

>

>

Výkon

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>

Charakteristika deštruktorov v C++

Nasledujú niektoré hlavné charakteristiky deštruktorov v C++:

  • Deštruktor je automaticky vyvolaný kompilátorom, keď jeho zodpovedajúci konštruktor prekročí rozsah a uvoľní pamäťový priestor, ktorý už program nepotrebuje.
  • Deštruktor nevyžaduje žiadny argument ani nevracia žiadnu hodnotu, preto nemôže byť preťažený.
  • Deštruktor nemôže byť deklarovaný ako statický a konštantný;
  • Deštruktor by mal byť deklarovaný vo verejnej časti programu.
  • Deštruktor sa volá v opačnom poradí ako pri vyvolaní jeho konštruktora.

Často kladené otázky o C++ konštruktoroch

Aké sú funkcie, ktoré predvolene generuje kompilátor, ak ich neposkytujeme explicitne?

Funkcie, ktoré kompilátor štandardne generuje, ak ich explicitne neposkytneme, sú:

  1. Predvolený konštruktor
  2. Kopírovať konštruktor
  3. Presun konštruktérov
  4. Operátor pridelenia
  5. Ničiteľ

Môžeme urobiť konštruktérov súkromnými?

Áno, v C++ môžu byť konštruktory súkromné. To znamená, že žiadny externý kód nemôže priamo vytvoriť objekt tejto triedy.

Ako sa konštruktéri líšia od normálnej členskej funkcie?

Konštruktor sa líši od bežných funkcií nasledujúcimi spôsobmi:

  • Konštruktor má rovnaký názov ako samotná trieda
  • Predvolené konštruktory však nemajú vstupný argument, Kopírovať a parametrizované konštruktory majú vstupné argumenty
  • Konštruktory nemajú návratový typ
  • Konštruktor sa automaticky volá pri vytvorení objektu.
  • Musí byť umiestnený vo verejnej časti triedy.
  • Ak nešpecifikujeme konštruktor, kompilátor C++ vygeneruje predvolený konštruktor pre objekt (neočakáva žiadne parametre a má prázdne telo).

Môžeme mať v triede viac ako jedného konštruktéra?

Áno, v triede môžeme mať viac ako jedného konštruktora. To sa nazýva Preťaženie konštruktora .

Súvisiace články:

  • Deštruktory v C++
  • Kvíz o konštruktéroch v C++
  • Výstup programov C++ | Sada 26 (konštruktéri)
  • Výstup programov C++ | Sada 27 (konštruktory a deštruktory)