Ініціалізація даних в класі. Конструктор класу. Конструктор за замовчуванням

Ініціалізація даних в класі. Конструктор класу. Конструктор за замовчуванням


Зміст


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# автоматично створить конструктор за замовчуванням. Цей конструктор ініціалізує усі змінні екземпляру класу їх значеннями за замовчуванням.

Для більшості типів даних значення за замовчуванням є нульовим, для типу boolfalse, для посилальних типів – пусте значення.

Приклад. Нехай задано клас 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)
    { }

    // конструктор, що отримує параметром посилання на об'єкт
    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

 


Зв’язані теми