Ініціалізація даних в класі. Конструктор класу. Конструктор за замовчуванням
Зміст
- 1. Що таке конструктори? Які відмінності між методами класу і конструкторами?
- 2. Яка загальна форма конструктора?
- 3. Скільки конструкторів може мати клас?
- 4. Що таке конструктор за замовчуванням?
- 5. Приклад ініціалізації класу з допомогою конструкторів.
- 6. Які конструктори називаються параметризованими?
- 7. Перевантаження конструкторів. Яким чином здійснюється перевантаження конструкторів? Приклад
- 8. Чи можна з одного конструктора викликати інший конструктор?
- 9. Яким чином можна викликати один конструктор з іншого? Загальна форма
- 10. Приклад виклику одного конструктору з іншого конструктору
- Зв’язані теми
Пошук на інших ресурсах:
1. Що таке конструктори? Які відмінності між методами класу і конструкторами?
З точки зору синтаксису, конструктор є подібний методу. Конструктор здійснює ініціалізацію об’єкту класу при його створенні. Конструктор має таке саме ім’я як і клас. Конструктор немає типу повернення, що вказується явно.
Як правило, конструктор застосовується для:
- задавання початкових значень змінних екземпляру класу;
- виконання деяких початкових операцій, що потрібні для створення повністю сформованого об’єкту.
⇑
2. Яка загальна форма конструктора?
Нижче наведено загальну форму конструктора:
доступ ім’я_класу(параметри)
{
// тіло конструктора
}
де
- доступ – модифікатор доступу. Найчастіше за все це модифікатор доступу public. Якщо конструктор викликається з-за меж класу, то він обов’язково повинен мати доступ public.
- параметри – список параметрів, що отримує конструктор. Список параметрів може бути порожній.
Приклад оголошення конструктора для класу MyPoint (дивіться попередні пункти). У даному конструкторі отримується два параметри з іменами newx, newy. Ці параметри ініціалізують внутрішні змінні класу x та y.
... public MyPoint(int newx, int newy) { x = newx; y = newy; } ... // використання описаного конструктора при створенні екземпляру класу MyPoint p = new MyPoint(5,8);
⇑
3. Скільки конструкторів може мати клас?
Клас може мати будь-яку кількість конструкторів, які повинні відрізнятись один від одного кількістю параметрів або типами параметрів.
⇑
4. Що таке конструктор за замовчуванням?
Якщо не визначити конструктор в класі, мова C# автоматично створить конструктор за замовчуванням. Цей конструктор ініціалізує усі змінні екземпляру класу їх значеннями за замовчуванням.
Для більшості типів даних значення за замовчуванням є нульовим, для типу bool – false, для посилальних типів – пусте значення.
Приклад. Нехай задано клас MyBook, який містить тільки дані. У класі немає жодного описаного конструктора. Все одно при створенні екземпляру класу (оператор new) викликається конструктор за замовчуванням.
... class MyBook { private string Title; private string Author; private int year; private float price; } ... // використання класу в програмі // викликається конструктор за замовчуванням MyBook(), який не описано в класі MyBook mb1 = new MyBook(); ...
⇑
5. Приклад ініціалізації класу з допомогою конструкторів.
Нехай дано опис класу типу MyBook. У класі MyBook описується два конструктори. Один конструктор без параметрів. Інший конструктор отримує чотири параметри, які заповнюють відповідні внутрішні поля класу MyBook.
... class MyBook { // поля класу - оголошені як приховані (private) private string Title; private string Author; private int year; private float price; // конструктор класу без параметрів public MyBook() { Title = ""; Author = ""; year = 1900; price = 0.00f; } // конструктор класу з чотирма параметрами public MyBook(string t, string a, int y, float p) { Title = t; Author = a; year = y; price = p; } } ... // використання конструкторів при ініціалізації даних (полів) класу MyBook mb1 = new MyBook(); MyBook mb2 = new MyBook("Title-1", "Author-1", 2000, 3.99f);
⇑
6. Які конструктори називаються параметризованими?
Параметризовані конструктори – це конструктори, які приймають один і більше параметрів.
⇑
7. Перевантаження конструкторів. Яким чином здійснюється перевантаження конструкторів? Приклад
Конструктор як і будь-який метод, може бути “перевантаженим”. Тобто, у класі може бути декілька конструкторів, які відрізняються між собою типами і (або) кількістю параметрів.
Приклад. Оголошується клас Time, що реалізує час: години, хвилини, секунди. У класі реалізується 4 конструктори з різною кількістю параметрів. Вихідний код класу наступний:
// клас, що описує час class Time { int hour; // години int min; // хвилини int sec; // секунди // конструктор без параметрів public Time() { hour = min = sec = 0; } // конструктор з одним параметром - встановлює тільки години public Time(int hour) { this.hour = hour; min = sec = 0; } // конструктор з двома параметрами - встановлює години, хвилини public Time(int hour, int min) { this.hour = hour; this.min = min; sec = 0; } // конструктор з трьома параметрами - встановлює години, хвилини, секунди public Time(int hour, int min, int sec) { this.hour = hour; this.min = min; this.sec = sec; } // методи доступу public int GetHour() { return hour; } public int GetMin() { return min; } public int GetSec() { return sec; } }
Використання класу Time в іншому методі (програмному коді):
// використання класу Time Time t0 = new Time(); // виклик конструктора без параметрів 00:00:00 Time t1 = new Time(8); // виклик конструктора з 1 параметром 08:00:00 Time t2 = new Time(5, 23); // виклик конструктора з 2 параметрами 05:23:00 Time t3; // тільки оголошення посилання на клас типу Time t3 = new Time(10, 20, 45); // створення об'єкту, виклик конструктора з 3 параметрами 10:20:45 // перевірка int h, m, s; h = t0.GetHour(); // h = 0 m = t0.GetMin(); // m = 0 h = t1.GetHour(); // h = 8 h = t2.GetHour(); // h = 5 m = t2.GetMin(); // m = 23 s = t2.GetSec(); // s = 0 h = t3.GetHour(); // h = 10 m = t3.GetMin(); // m = 20 s = t3.GetSec(); // s = 45
⇑
8. Чи можна з одного конструктора викликати інший конструктор?
Так можна. Це здійснюється з допомогою ключового слова this. Ключове слово this є посиланням на поточний клас. Тобто, this є іменем поточного класу, а, отже, може використовуватись як конструктор.
⇑
9. Яким чином можна викликати один конструктор з іншого? Загальна форма
Загальна форма виклику з одного конструктора іншого в класі, що має ім’я ClassName:
class ClassName { // це конструктор ClassName(parameters_list1) : this(parameters_list2) { // тіло конструктора ClassName } }
У цьому випадку спочатку виконується конструктор
this(parameters_list2)
а потім виконується конструктор
ClassName(parameters_list1)
Тіло конструктора ClassName може бути пустим.
⇑
10. Приклад виклику одного конструктору з іншого конструктору
У прикладі реалізується клас Time, що описує клас. У класі є декілька конструкторів. Кожен з них ініціалізується по різному.
Лістинг класу наступний
// клас, що описує час class Time { int hour; // години int min; // хвилини int sec; // секунди // конструктор без параметрів - ініціалізується з допомогою конструктора з 3 параметрами public Time() : this(0, 0, 0) { // тіло конструктора пусте } // конструктор з одним параметром - встановлює тільки години public Time(int hour) : this(hour, 0, 0) { } // конструктор з двома параметрами - встановлює години, хвилини public Time(int hour, int min) : this(hour, min, 0) { } // конструктор з трьома параметрами - встановлює години, хвилини, секунди public Time(int hour, int min, int sec) { this.hour = hour; this.min = min; this.sec = sec; } // конструктор, що отримує параметром посилання на об'єкт public Time(Time t) : this(t.GetHour(), t.GetMin(), t.GetSec()) { } // методи доступу public int GetHour() { return hour; } public int GetMin() { return min; } public int GetSec() { return sec; } }
Використання класу в іншому програмному коді (методі)
// використання класу Time Time t0 = new Time(); // виклик конструктора без параметрів 00:00:00 Time t1 = new Time(8); // виклик конструктора з 1 параметром 08:00:00 Time t2 = new Time(7, 17); // виклик конструктора з 2 параметрами 07:17:00 Time t3; // тільки оголошення посилання на клас типу Time t3 = new Time(7, 10, 15); // створення об'єкту, виклик конструктора з 3 параметрами 7:10:15 Time t4 = new Time(t3); // виклик конструктора, що приймає параметром об'єкт класу // перевірка int h, m, s; h = t0.GetHour(); // h = 0 m = t0.GetMin(); // m = 0 h = t1.GetHour(); // h = 8 h = t2.GetHour(); // h = 7 m = t2.GetMin(); // m = 17 s = t2.GetSec(); // s = 0 h = t3.GetHour(); // h = 7 m = t3.GetMin(); // m = 10 s = t3.GetSec(); // s = 15 h = t4.GetHour(); // h = 7 m = t4.GetMin(); // m = 10 s = t4.GetSec(); // s = 15
⇑
Зв’язані теми
- Поняття класу. Загальна форма оголошення класу. Об’єкт класу. Поля класу. Приклади. Ключове слово this. Вкладені класи
- Деструктор. “Збір сміття”
- Динамічне виділення пам’яті. Оператор new. Виділення пам’яті для типів-значень, структур, перечислень, об’єктів класів. Виділення пам’яті для масивів