logo

Konstruktory v C++

Konstruktor v C++ je speciální metoda, která je vyvolána automaticky v okamžiku vytvoření objektu. Obecně se používá k inicializaci datových členů nových objektů. Konstruktor v C++ má stejný název jako třída nebo struktura. Konstruuje hodnoty, tj. poskytuje data pro objekt, a proto je známý jako konstruktor.

  • Konstruktor je členská funkce třídy, jejíž název je stejný jako název třídy.
  • Konstruktor je speciální typ členské funkce, která se používá k automatické inicializaci datových členů pro objekt třídy, když je vytvořen objekt stejné třídy.
  • Konstruktor je vyvolán v okamžiku vytvoření objektu. Konstruuje hodnoty, tj. poskytuje data pro objekt, a proto je známý jako konstruktor.
  • Konstruktory nevracejí hodnotu, a proto nemají návratový typ.
  • Konstruktor se zavolá automaticky, když vytvoříme objekt třídy.
  • Konstruktory mohou být přetížené.
  • Konstruktor nelze prohlásit za virtuální.

Syntaxe konstruktorů v C++

Prototyp konstruktoru vypadá takto:

 (list-of-parameters);>

Konstruktor může být definován uvnitř deklarace třídy nebo mimo deklaraci třídy



Syntaxe pro definování konstruktoru v rámci třídy

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

Syntaxe pro definování konstruktoru mimo třídu

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

Příklady konstruktorů v C++

Níže uvedené příklady ukazují, jak deklarovat konstruktory pro třídu v C++:

asistent policejního komisaře

Příklad 1: Definování konstruktoru v rámci třídy

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>> jméno;> >cout <<>'Enter the Fee:'>;> >cin>> poplatek;> >}> >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ýstup

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

Příklad 2: Definování konstruktoru mimo třídu

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

>

>

Výstup

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

Poznámka: Můžeme vytvořit konstruktor definovaný mimo třídu jako v souladu aby byla ekvivalentní definici třídy in. Ale všimněte si toho v souladu není instrukce pro kompilátor, je to pouze požadavek, který kompilátor může nebo nemusí implementovat v závislosti na okolnostech.

Charakteristika konstruktorů v C++

Níže jsou uvedeny některé hlavní charakteristiky konstruktorů v C++:

  • Název konstruktoru je stejný jako název jeho třídy.
  • Konstruktory jsou většinou deklarovány ve veřejné části třídy, i když mohou být deklarovány v soukromé části třídy.
  • Konstruktory nevracejí hodnoty; proto nemají návratový typ.
  • Konstruktor se zavolá automaticky, když vytvoříme objekt třídy.
  • Konstruktory mohou být přetížené.
  • Konstruktor nelze prohlásit za virtuální.
  • Konstruktor nelze zdědit.
  • Na adresy Konstruktora nelze odkazovat.
  • Konstruktor provádí implicitní volání Nový a vymazat operátory během alokace paměti.

Typy konstruktorů v C++

Konstruktory lze klasifikovat podle toho, v jakých situacích se používají. V C++ existují 4 typy konstruktorů:

  1. Výchozí konstruktor
  2. Parametrizovaný konstruktor
  3. Kopírovat konstruktor
  4. Konstruktor přesunu

Pojďme pochopit typy konstruktorů v C++ na příkladu z reálného světa. Předpokládejme, že jste šli do obchodu koupit fix. Když si chcete koupit fix, jaké jsou možnosti? První, kdy půjdeš do obchodu a řekneš mi dej fix. Takže jen říct dej mi značku znamená, že jsi nenastavil název značky a jakou barvu, nic jsi nezmínil, jen jsi řekl, že chceš značku. Takže když jsme řekli, že chci fix, ať už je na trhu nebo v jeho obchodě často prodávaný fix, jednoduše mi ho předá. A to je výchozí konstruktor!

Druhý způsob je, že půjdete do obchodu a řeknete, že chci značku červené barvy a značky XYZ. Takže se o tom zmiňujete a on vám dá tu značku. V tomto případě jste tedy zadali parametry. A to je parametrizovaný konstruktor!

Pak u třetího půjdete do obchodu a řeknete, že chci takový fix (fyzický fix na ruce). Takže prodavač tu značku uvidí. Dobře, a dá vám novou značku. Takže kopie té značky. A to je kopírovací konstruktor!

Nyní předpokládejme, že si nekoupíte novou značku, ale převezmete vlastnictví značky svého přítele. Znamená to převzít vlastnictví již existujících zdrojů namísto získávání nových. To je konstruktor pohybu!

1. Výchozí konstruktor v C++

A výchozí konstruktor je konstruktér, který nebere žádný argument. Nemá žádné parametry. Říká se mu také konstruktor s nulovým argumentem.

Syntaxe výchozího konstruktoru

className() {     // body_of_constructor  }>

Příklady výchozího konstruktoru

Níže uvedené příklady ukazují, jak používat výchozí konstruktory v C++.

Pří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ýstup

a: 10 b: 20>

Poznámka: I když žádný konstruktor explicitně nedefinujeme, překladač automaticky implicitně poskytne výchozí konstruktor.

Pří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ýstup

(no output)>

Jak vidíme, jsme schopni vytvořit objekt studenta třídy bez předávání jakéhokoli argumentu, i když jsme pro něj nedefinovali žádný explicitní výchozí konstruktor.

2. Parametrizovaný konstruktor v C++

Parametrizované konstruktory umožňují předávat argumenty konstruktorům. Tyto argumenty obvykle pomáhají inicializovat objekt při jeho vytvoření. Chcete-li vytvořit parametrizovaný konstruktor, jednoduše do něj přidejte parametry stejně jako u jakékoli jiné funkce. Když definujete tělo konstruktoru, použijte parametry k inicializaci objektu.

Syntaxe parametrizovaného konstruktoru

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

Příklady parametrizovaného konstruktoru

Níže uvedené příklady ukazují, jak používat parametrizované konstruktory v C++.

Příklad 1: Definování parametrizovaného konstruktoru uvnitř třídy.

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ýstup

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

Příklad 2: Definování parametrizovaného konstruktoru mimo třídu.

C++


seznam uživatelů mysql



// 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ýstup

1001 Ram 10000>

Když je objekt deklarován v parametrizovaném konstruktoru, musí být počáteční hodnoty předány jako argumenty funkci konstruktoru. Normální způsob deklarace objektu nemusí fungovat. Parametrizované konstruktory lze volat explicitně nebo implicitně:

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

Když je definován parametrizovaný konstruktor a není explicitně definován žádný výchozí konstruktor, kompilátor implicitně nevytvoří výchozí konstruktor, a proto nevytvoří jednoduchý objekt jako:

Student s;>

bude blikat chyba.

Pří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;> }>

>

>

arraylist v jazyce Java

Výstup

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: Kdykoli definujeme jeden nebo více nestandardních konstruktorů (s parametry) pro třídu, měl by být také explicitně definován výchozí konstruktor (bez parametrů), protože kompilátor v tomto případě neposkytne výchozí konstruktor. Není to však nutné, ale považuje se za nejlepší postup vždy definovat výchozí konstruktor.

Použití parametrizovaného konstruktoru

  • Používá se k inicializaci různých datových prvků různých objektů s různými hodnotami, když jsou vytvořeny.
  • Používá se k přetížení konstruktorů.

Výchozí argumenty s parametrizovaným konstruktorem C++

Stejně jako normální funkce můžeme také definovat výchozí hodnoty pro argumenty parametrizovaných konstruktorů. Všechna pravidla výchozí argumenty budou použity na tyto parametry.

Příklad 3: Definování parametrizovaného konstruktoru s výchozí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ýstup

First Object Data: 0 Second Object Data: 25>

Jak vidíme, když jsou výchozí hodnoty přiřazeny každému argumentu parametrizovaného konstruktoru, je legální vytvořit objekt bez předávání jakýchkoli parametrů, stejně jako výchozí konstruktory. Tento typ konstruktoru tedy funguje jako výchozí i parametrizovaný konstruktor.

3. Zkopírujte konstruktor v C++

Kopírovací konstruktor je členská funkce, která inicializuje objekt pomocí jiného objektu stejné třídy.

Syntaxe Kopírovat konstruktor

Kopírovat konstruktor bere jako argument odkaz na objekt stejné třídy.

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

Stejně jako výchozí konstruktor poskytuje kompilátor C++ také implicitní kopírovací konstruktor, pokud není přítomna explicitní definice konstruktoru kopírování. Zde je třeba poznamenat, že na rozdíl od výchozího konstruktoru, kde přítomnost jakéhokoli typu explicitního konstruktoru vede ke smazání implicitního výchozího konstruktoru, konstruktor implicitní kopie bude vždy vytvořen kompilátorem, pokud neexistuje konstruktor explicitní kopie. nebo je přítomen konstruktor explicitního přesunu.

Příklady Copy Constructor

Níže uvedené příklady ukazují, jak používat kopírovací konstruktory v C++.

Příklad 1: Ilustrace konstruktoru implicitní kopie

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ýstup

ID=10 ID=10>

Příklad 2: Definování konstruktoru explicitního kopírování

základní pásmo vs širokopásmové připojení

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

>

>

Výstup

ID=10 ID=10>

Příklad 3: Definování konstruktoru explicitního kopírování s parametrizovaným konstruktorem

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ýstup

1001 Manjeet 10000 1001 Manjeet 10000>

Použití Copy Constructor

  • Vytvoří nový objekt zkopírováním hodnot z existujícího objektu.
  • Lze použít k provádění hlubokého kopírování.
  • V případě potřeby upravte specifické atributy během procesu kopírování.

4. Přesuňte konstruktor v C++

Konstruktor přesunu je nedávným přírůstkem do rodiny konstruktorů v C++. Je to jako konstruktor kopírování, který zkonstruuje objekt z již existujících objektů, ale místo zkopírování objektu do nové paměti využívá sémantiku přesunu k přenosu vlastnictví již vytvořeného objektu na nový objekt bez vytváření dalších objektů. kopie.

Může to být viděno jako krádež zdrojů z jiných objektů.

Syntaxe konstruktoru pohybu v C++

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

The přesunout konstruktor bere rvalue reference objektu stejné třídy a převede vlastnictví tohoto objektu na nově vytvořený objekt.

Stejně jako konstruktor kopírování vytvoří kompilátor konstruktor přesunu pro každou třídu, která nemá žádný explicitní konstruktor přesunu.

Příklady Move Constructor

Níže uvedené příklady ukazují, jak používat konstruktory přesunu v C++.

Příklad 1: Definování konstruktoru 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;> }>

>

string.format v jazyce Java

>

Výstup

Move Constructor Called newBox.data: 42>

Použití konstruktoru pohybu

  • Namísto vytváření kopií přesouvejte konstruktéry efektivně a převádějte vlastnictví těchto zdrojů.
  • To zabraňuje zbytečnému kopírování paměti a snižuje režii.
  • Můžete definovat svůj vlastní konstruktor přesunu pro zpracování konkrétních přenosů prostředků.

Destruktory v C++

Destruktor je také speciální členská funkce jako konstruktor. Destruktor ničí objekty třídy vytvořené konstruktorem. Destruktor má stejný název jako název jejich třídy, před kterým je symbol vlnovky (~). Není možné definovat více než jeden destruktor. Destruktor je pouze jeden způsob, jak zničit objekt vytvořený konstruktorem. Destruktor tedy nemůže být přetížen. Destruktor nevyžaduje žádný argument ani nevrací žádnou hodnotu. Volá se automaticky, když objekt překročí rozsah. Destruktory uvolňují paměťový prostor obsazený objekty vytvořenými konstruktorem. v ničitel , objekty jsou zničeny v opačném směru než vytvoření objektu.

Syntaxe destruktorů v C++

Stejně jako konstruktory mohou být také destruktory definovány uvnitř nebo vně třídy.

Syntaxe pro definování destruktoru v rámci třídy

~ (){}>

Syntaxe pro definování destruktoru mimo třídu

: : ~(){}>

Příklady destruktorů v C++

Níže uvedené příklady ukazují, jak používat destruktory v C++.

Příklad 1: Definování jednoduchého destruktoru

C++




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

>

>

Výstup

 Constructor executed Destructor executed>

Příklad 2: Počítání, kolikrát byl objekt vytvořen 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ýstup

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 destruktorů v C++

Níže jsou uvedeny některé hlavní charakteristiky destruktorů v C++:

  • Destruktor je automaticky vyvolán kompilátorem, když jeho odpovídající konstruktor překročí rozsah a uvolní paměťový prostor, který již program nepotřebuje.
  • Destruktor nevyžaduje žádný argument ani nevrací žádnou hodnotu, takže nemůže být přetížen.
  • Destruktor nelze deklarovat jako statický a const;
  • Destruktor by měl být deklarován ve veřejné části programu.
  • Destruktor je volán v opačném pořadí než jeho vyvolání konstruktoru.

Často kladené otázky o konstruktorech C++

Jaké jsou funkce, které jsou ve výchozím nastavení generovány kompilátorem, pokud je neposkytujeme explicitně?

Funkce, které kompilátor ve výchozím nastavení generuje, pokud je explicitně neposkytneme, jsou:

  1. Výchozí konstruktor
  2. Kopírovat konstruktor
  3. Přesunout konstruktéry
  4. Operátor přiřazení
  5. ničitel

Můžeme udělat konstruktéry soukromými?

Ano, v C++ mohou být konstruktory soukromé. To znamená, že žádný externí kód nemůže přímo vytvořit objekt této třídy.

Jak se konstruktory liší od normální členské funkce?

Konstruktor se od normálních funkcí liší následujícími způsoby:

  • Konstruktor má stejný název jako samotná třída
  • Výchozí konstruktory však nemají vstupní argument, Kopírovat a parametrizované konstruktory mají vstupní argumenty
  • Konstruktory nemají návratový typ
  • Při vytvoření objektu je automaticky volán konstruktor.
  • Musí být umístěn ve veřejné části třídy.
  • Pokud neuvedeme konstruktor, kompilátor C++ vygeneruje výchozí konstruktor pro objekt (neočekává žádné parametry a má prázdné tělo).

Můžeme mít ve třídě více než jednoho konstruktéra?

Ano, ve třídě můžeme mít více než jeden konstruktor. To se nazývá Přetížení konstruktoru .

Související články:

  • Destruktory v C++
  • Kvíz o konstruktorech v C++
  • Výstup programů C++ | Sada 26 (konstruktéři)
  • Výstup programů C++ | Sada 27 (konstruktoři a destruktori)