Конструктор на С++ це спеціальний метод, який автоматично викликається під час створення об'єкта. Він зазвичай використовується для ініціалізації членів даних нових об’єктів. Конструктор у C++ має те саме ім’я, що й клас або структура. Він створює значення, тобто надає дані для об’єкта, тому його називають конструктором.
- Конструктор - це функція-член класу, ім'я якого збігається з ім'ям класу.
- Конструктор — це спеціальний тип функції-члена, який використовується для автоматичної ініціалізації членів даних для об’єкта класу під час створення об’єкта того самого класу.
- Конструктор викликається під час створення об'єкта. Він створює значення, тобто надає дані для об’єкта, тому його називають конструктором.
- Конструктори не повертають значення, тому вони не мають типу повернення.
- Конструктор викликається автоматично, коли ми створюємо об’єкт класу.
- Конструктори можуть бути перевантажені.
- Конструктор не можна оголосити віртуальним.
Синтаксис конструкторів у C++
Прототип конструктора виглядає так:
(list-of-parameters);>
Конструктор може бути визначений в декларації класу або поза декларацією класу
Синтаксис для визначення конструктора в класі
(list-of-parameters) { // constructor definition }> Синтаксис для визначення конструктора поза класом
: :(list-of-parameters) { // constructor definition }> Приклади конструкторів у C++
Наведені нижче приклади демонструють, як оголосити конструктори для класу в C++:
Приклад 1: Визначення конструктора в класі
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>> ім'я;> >cout <<>'Enter the Fee:'>;> >cin>> плата;> >}> >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;> }> |
>
>
Вихід
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>
Приклад 2: Визначення конструктора поза класом
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>> ім'я;> >cout <<>'Enter the Fee:'>;> >cin>> плата;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }> |
>
>
Вихід
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>
Примітка: Ми можемо зробити конструктор, визначений поза класом як в лінію щоб зробити його еквівалентним визначенню в класі. Але зауважте, що в лінію не є інструкцією для компілятора, це лише запит, який компілятор може або не може реалізувати залежно від обставин.
Характеристики конструкторів у C++
Нижче наведено деякі основні характеристики конструкторів у C++:
- Ім'я конструктора збігається з ім'ям його класу.
- Конструктори здебільшого оголошуються у публічній частині класу, хоча вони можуть бути оголошені в приватній частині класу.
- Конструктори не повертають значень; тому вони не мають типу повернення.
- Конструктор викликається автоматично, коли ми створюємо об’єкт класу.
- Конструктори можуть бути перевантажені.
- Конструктор не можна оголосити віртуальним.
- Конструктор не можна успадковувати.
- Посилання на адреси Конструктора неможливе.
- Конструктор здійснює неявні виклики новий і видалити оператори під час розподілу пам'яті.
Типи конструкторів у C++
Конструктори можна класифікувати залежно від того, в яких ситуаціях вони використовуються. У C++ є 4 типи конструкторів:
- Конструктор за замовчуванням
- Параметризований конструктор
- Конструктор копіювання
- Конструктор переміщення
Давайте розберемо типи конструкторів у C++ на прикладі реального світу. Припустимо, ви пішли в магазин купити маркер. Якщо ви хочете купити маркер, які є варіанти? Перший, коли ви йдете в магазин і кажете, дайте мені маркер. Тож просто сказати «Дайте мені маркер» означає, що ви не вказали назву марки та колір, ви нічого не згадали, просто сказали, що вам потрібен маркер. Тож коли ми сказали, що я хочу маркер, незалежно від того, який маркер часто продається на ринку чи в його магазині, він просто віддасть його. І ось що таке конструктор за замовчуванням!
Другий спосіб полягає в тому, що ви йдете в магазин і говорите, що я хочу маркер червоного кольору та марки XYZ. Отже, ви згадуєте про це, і він дасть вам цей маркер. Отже, у цьому випадку ви вказали параметри. І ось що таке параметризований конструктор!
Потім третій — ви йдете в магазин і кажете, що я хочу такий маркер (фізичний маркер на руці). Тож власник магазину побачить цей маркер. Гаразд, і він дасть вам новий маркер. Тож скопіюйте цей маркер. І ось що таке конструктор копій!
Тепер припустімо, що ви не купуєте новий маркер, а натомість отримуєте право власності на маркер свого друга. Це означає взяти у власність уже наявні ресурси замість отримання нових. Ось що таке конструктор ходів!
1. Конструктор за замовчуванням у C++
А конструктор за замовчуванням це конструктор, який не приймає жодних аргументів. Він не має параметрів. Його також називають конструктором з нульовим аргументом.
Синтаксис конструктора за замовчуванням
className() { // body_of_constructor }> Приклади конструктора за замовчуванням
Наведені нижче приклади демонструють, як використовувати конструктори за замовчуванням у C++.
приклад 1:
CPP
читання файлу csv в java
// 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;> }> |
>
>Вихід
a: 10 b: 20>
Примітка: Навіть якщо ми не визначимо жодного конструктора явно, компілятор автоматично надасть конструктор за замовчуванням неявно.
приклад 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;> }> |
>
>
Вихід
(no output)>
Як ми бачимо, ми можемо створювати об’єкт класу student без передачі будь-яких аргументів, навіть якщо ми не визначили для нього жодного явного конструктора за замовчуванням.
2. Параметризований конструктор у C++
Параметризовані конструктори дають змогу передавати аргументи конструкторам. Як правило, ці аргументи допомагають ініціалізувати об’єкт під час його створення. Щоб створити параметризований конструктор, просто додайте до нього параметри так само, як і до будь-якої іншої функції. Коли ви визначаєте тіло конструктора, використовуйте параметри для ініціалізації об’єкта.
Синтаксис параметризованого конструктора
className (parameters...) { // body }> Приклади параметризованого конструктора
Наведені нижче приклади демонструють, як використовувати параметризовані конструктори в C++.
Приклад 1: Визначення параметризованого конструктора всередині класу.
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;> }> |
>
>Вихід
p1.x = 10, p1.y = 15>
Приклад 2: Визначення параметризованого конструктора поза класом.
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;> }> |
>
>Вихід
1001 Ram 10000>
Коли об’єкт оголошено в параметризованому конструкторі, початкові значення повинні бути передані як аргументи функції-конструктора. Звичайний спосіб оголошення об’єкта може не працювати. Параметризовані конструктори можна викликати явно або неявно:
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
Коли параметризований конструктор визначено, а конструктор за замовчуванням не визначено явно, компілятор неявно створить конструктор за замовчуванням і, отже, створить простий об’єкт як:
Student s;>
буде блимати повідомлення про помилку.
приклад 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;> }> |
>
>
Вихід
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 ^~> Важлива примітка: Кожного разу, коли ми визначаємо один або більше нестандартних конструкторів (з параметрами) для класу, типовий конструктор (без параметрів) також має бути явно визначений, оскільки в цьому випадку компілятор не надаватиме конструктор за замовчуванням. Однак це не обов’язково, але вважається найкращою практикою завжди визначати конструктор за замовчуванням.
Використання параметризованого конструктора
- Він використовується для ініціалізації різних елементів даних різних об’єктів різними значеннями під час їх створення.
- Він використовується для перевантаження конструкторів.
Аргументи за замовчуванням із параметризованим конструктором C++
Подібно до звичайних функцій, ми також можемо визначити значення за замовчуванням для аргументів параметризованих конструкторів. Всі правила аргументи за замовчуванням буде застосовано до цих параметрів.
Приклад 3: Визначення параметризованого конструктора зі значеннями за замовчуванням
C++
mysql список користувачів
// 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;> }> |
>
>Вихід
First Object Data: 0 Second Object Data: 25>
Як ми бачимо, коли значення за замовчуванням призначаються кожному аргументу параметризованого конструктора, цілком допустимо створити об’єкт без передачі параметрів, як і конструкторів за замовчуванням. Таким чином, цей тип конструктора працює і як конструктор за замовчуванням, і як параметризований конструктор.
3. Конструктор копіювання в C++
Конструктор копіювання — це функція-член, яка ініціалізує об’єкт за допомогою іншого об’єкта того самого класу.
Синтаксис Конструктор копіювання
Конструктор копіювання приймає посилання на об’єкт того самого класу як аргумент.
ClassName (ClassName &obj) { // body_containing_logic }> Як і конструктор за замовчуванням, компілятор C++ також надає неявний конструктор копіювання, якщо визначення конструктора явного копіювання відсутнє. Тут слід зазначити, що на відміну від конструктора за замовчуванням, де наявність будь-якого типу явного конструктора призводить до видалення неявного конструктора за замовчуванням, неявний конструктор копіювання завжди створюватиметься компілятором, якщо немає явного конструктора копіювання або присутній явний конструктор переміщення.
Приклади конструктора копіювання
Наведені нижче приклади демонструють, як використовувати конструктори копіювання в C++.
Приклад 1: Ілюстрація неявного конструктора копіювання
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;> }> |
>
>Вихід
ID=10 ID=10>
Приклад 2: Визначення явного конструктора копіювання
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;> }> |
>
>Вихід
ID=10 ID=10>
Приклад 3: Визначення явного конструктора копіювання за допомогою параметризованого конструктора
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;> }> |
>
>Вихід
1001 Manjeet 10000 1001 Manjeet 10000>
Використання Конструктора копіювання
- Створює новий об’єкт, копіюючи значення з існуючого об’єкта.
- Можна використовувати для глибокого копіювання.
- За потреби змініть певні атрибути під час процесу копіювання.
4. Переміщення конструктора в C++
Конструктор переміщення є нещодавнім доповненням до сімейства конструкторів у C++. Це як конструктор копіювання, який створює об’єкт із уже існуючих об’єктів, але замість того, щоб копіювати об’єкт у нову пам’ять, він використовує семантику переміщення, щоб передати право власності на вже створений об’єкт новому об’єкту без створення додаткових копій.
Це можна розглядати як крадіжку ресурсів з інших об'єктів.
Синтаксис конструктора переміщення в C++
className (className&& obj) { // body of the constructor }> The конструктор переміщення приймає посилання на rvalue об'єкта того самого класу та передає право власності на цей об'єкт новоствореному об'єкту.
Подібно до конструктора копіювання, компілятор створить конструктор переміщення для кожного класу, який не має жодного явного конструктора переміщення.
Приклади конструктора переміщення
Наведені нижче приклади демонструють, як використовувати конструктори переміщення в C++.
Приклад 1: Визначення конструктора переміщення
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;> }> |
>
str до внутр
>Вихід
Move Constructor Called newBox.data: 42>
Використання конструктора переміщення
- Замість створення копій конструктори переміщення ефективно передають право власності на ці ресурси.
- Це запобігає непотрібному копіюванню пам’яті та зменшує накладні витрати.
- Ви можете визначити свій власний конструктор переміщення для обробки конкретних передач ресурсів.
Деструктори в C++
Деструктор також є спеціальною функцією-членом як конструктор. Деструктор знищує об'єкти класу, створені конструктором. Деструктор має таке ж ім’я, як ім’я класу, якому передує символ тильди (~). Неможливо визначити більше одного деструктора. Деструктор - це лише один із способів знищити об'єкт, створений конструктором. Тому деструктор не може бути перевантажений. Деструктор не вимагає жодних аргументів і не повертає значення. Він автоматично викликається, коли об'єкт виходить за межі області видимості. Деструктори звільняють простір пам’яті, зайнятий об’єктами, створеними конструктором. в руйнівник , об’єкти знищуються у зворотному порядку створення об’єкта.
Синтаксис деструкторів у C++
Як і конструктори, деструктори також можуть бути визначені всередині або поза класом.
Синтаксис для визначення деструктора в класі
~ (){}> Синтаксис для визначення деструктора поза класом
: : ~(){}> Приклади деструкторів у C++
Наведені нижче приклади демонструють, як використовувати деструктори в C++.
Приклад 1: Визначення простого деструктора
C++
#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>'
Constructor executed'>; }> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Вихід
Constructor executed Destructor executed>
Приклад 2: Підрахунок кількості разів створення та знищення об’єкта
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;> }> |
>
>
Вихід
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>
Характеристики деструкторів у C++
Нижче наведено деякі основні характеристики деструкторів у C++:
- Деструктор автоматично викликається компілятором, коли його відповідний конструктор виходить за межі області видимості та звільняє простір пам’яті, який більше не потрібен програмі.
- Деструктор не вимагає жодних аргументів і не повертає значення, тому його не можна перевантажувати.
- Деструктор не може бути оголошений як static і const;
- Деструктор повинен бути оголошений у публічному розділі програми.
- Деструктор викликається в порядку, зворотному його виклику конструктора.
Часті запитання щодо конструкторів C++
Які функції генеруються компілятором за замовчуванням, якщо ми не надаємо їх явно?
Функції, які генеруються компілятором за замовчуванням, якщо ми не надаємо їх явно:
- Конструктор за замовчуванням
- Конструктор копіювання
- Конструктори переміщення
- Оператор присвоєння
- Руйнівник
Чи можемо ми зробити конструкторів приватними?
Так, у C++ конструктори можна зробити приватними. Це означає, що жоден зовнішній код не може безпосередньо створити об’єкт цього класу.
Чим конструктори відрізняються від звичайної функції-члена?
Конструктор відрізняється від звичайних функцій наступним чином:
- Конструктор має таке ж ім'я, як і сам клас
- Конструктори за замовчуванням не мають вхідних аргументів, однак копіювання та параметризовані конструктори мають вхідні аргументи
- Конструктори не мають типу повернення
- Конструктор автоматично викликається під час створення об’єкта.
- Він має бути розміщений у загальнодоступній частині класу.
- Якщо ми не вказуємо конструктор, компілятор C++ генерує конструктор за замовчуванням для об’єкта (не очікує параметрів і має порожнє тіло).
Чи можемо ми мати більше одного конструктора в класі?
Так, у класі може бути більше одного конструктора. Це називається Перевантаження конструктора .
Пов'язані статті:
- Деструктори в C++
- Тест про конструктори в C++
- Вивід програм на С++ | Набір 26 (Конструктори)
- Вивід програм на С++ | Набір 27 (Конструктори та деструктори)