Конструктори. Конструктори за замовчуванням. Виклик конструкторів класу з інших конструкторів

Конструктори. Конструктори за замовчуванням. Виклик конструкторів класу з інших конструкторів


Зміст


1. Що називається конструктором за замовчуванням?

Конструктор за замовчуванням (default constructor) – це конструктор, що не має параметрів. Конструктор за замовчуванням може оголошуватись у класі явним чином або генеруватись автоматично.

У найбільш загальному випадку, для класу ClassName, конструктор за замовчуванням має такий вигляд:

class ClassName
{
    ...
 
    // оголошення конструктора
    ClassName()
    {
        // тіло конструктора
        // ...
    }

    ...
}

2. У яких випадках конструктор за замовчуванням генерується у класі автоматично а в яких ні? Приклад

Якщо у класі не оголошувати жодного конструктора, то, буде генеруватись конструктор за замовчуванням. Тобто, конструктор за замовчуванням генерується у класі автоматично тільки у тому випадку, якщо клас не містить реалізації інших конструкторів. Якщо клас містить реалізацію хоча б одного конструктора з параметрами, то, щоб оголосити конструктор за замовчуванням, його потрібно оголошувати в класі явним чином.

Наприклад. У наступному оголошенні класу конструктор за замовчуванням генерується автоматично

class MyClass
{
    int d;
    int GetD() { return d; }
    void SetD(int nd) { d = nd; }
}

Вищенаведений код означає, що можна оголошувати об’єкт класу з використанням конструктора за замовчуванням:

// працює, тому що в класі більше не реалізовано жодного конструктора
CMyClass mc = new CMyClass();

Якщо у тіло класу CMyClass додати хоча б один інший конструктор (наприклад, конструктор з одним параметром), то конструктор за замовчуванням автоматично генеруватись не буде

class CMyClass
{
    int d;

    // оголошення конструктора з 1 параметром,
    // конструктор за замовчуванням уже не генерується автоматично
    CMyClass(int nd) { d = nd; }
    int GetD() { return d; }
    void SetD(int nd) { d = nd; }
}

Після вищенаведеної реалізації оголосити об’єкт з використанням конструктора за замовчуванням не вдасться. Однак можна оголосити об’єкт з використанням конструктора з одним параметром

// помилка компіляції, тому що в класі вже оголошений інший конструктор
// CMyClass mc = new CMyClass();

CMyClass mc2 = new CMyClass(7); // а цей код працює

У результаті виконання вищенаведеного рядка буде видано помилку компіляції:

The constructor CMyClass() is undefined

Для того, щоб мати реалізацію конструктора за замовчуванням та оголошувати об’єкт класу з використанням конструктора за замовчуванням, його потрібно задавати явним чином. Це може бути, наприклад, так

class CMyClass
{
    int d;

    // оголошення конструктора за замовчуванням явним чином
    CMyClass() { d = 0; }

    // оголошення конструктора з 1 параметром
    CMyClass(int nd) { d = nd; }

    int GetD() { return d; }
    void SetD(int nd) { d = nd; }
}

Після такої реалізації можна створювати екземпляр класу з використанням двох конструкторів, наприклад

CMyClass mc = new CMyClass(); // викликається конструктор за замовчуванням
mc.d = 25;

CMyClass mc2 = new CMyClass(5); // викликається конструктор з 1 параметром

3. Виклик конструкторів з інших конструкторів. Приклад

Мова програмування Java дозволяє здійснювати виклик конструкторів класу з іншого конструктора цього ж класу. Для цього використовується ключове слово this, що є посиланням на поточний клас.

Приклад. У прикладі демонструється використання класу CPixel, який реалізує піксел на екрані монітору.

// Клас, що реалізує піксел на екрані монітору
public class CPixel
{
    // внутрішні змінні класу
    private int x, y; // координати піксела на екрані монітору
    private int color; // колір піксела

    // конструктор без параметрів (конструктор за замовчуванням)
    CPixel()
    {
        x = y = color = 0;
    }

    // конструктор з 2 параметрами, що ініціалізує тільки координати
    CPixel(int _x, int _y)
    {
        x = _x;
        y = _y;
        color = 0;
    }

    // конструктор з 1 параметром, що ініціалізує тільки колір
    CPixel(int _color)
    {
        color = _color;
        x = y = 0;
    }

    // конструктор з 3 параметрами, який викликає конструктор з 2 параметрами
    CPixel (int _x, int _y, int _color)
    {
        // виклик конструктора з 2 параметрами: обов'язково перша операція і тільки один раз
        this(_x, _y);
        //this(_color); // повторний виклик конструктора - заборонений
        this.color = _color; // так можна
    }

    // методи доступу
    int GetX() { return x; }
    int GetY() { return y; }
    int GetColor() { return color; }
}

Використання класу CPixel в іншому програмному коді (методі)

...

CPixel cp1 = new CPixel(2,8); // виклик конструктора з 2 параметрами
CPixel cp2 = new CPixel(3,5,8); // виклик конструктора, що викликає інший конструктор
int d;

d = cp1.GetX(); // d = 2
d = cp2.GetColor(); // d = 8
d = cp2.GetY(); // d = 5

...

4. Які обмеження (вимоги) накладаються на виклик інших конструкторів з конструктора класу?

Щоб коректно викликати інші конструктори з конструктора класу, потрібно дотримуватись наступних вимог (обмежень):

  • викликати можна тільки один інший конструктор класу. Викликати два і більше інших конструкторів цього класу заборонено. Це випливає з логіки, що конструктор класу призначається для створення об’єкту класу тільки один раз (а не два і більше разів);
  • виклик іншого конструктора має бути першою операцією у викликаючому конструкторі. Якщо у викликаючому конструкторі виклик іншого конструктора реалізувати другою (третьою і т.д.) операцією, то компілятор видасть помилку.



5. Чи можна викликати конструктор зі звичайного методу класу?

Ні, не можна. Конструктор класу може викликатись тільки з іншого конструктора цього ж класу. Головне призначення конструктору класу – створювати екземпляри (об’єкти) класу. Методи класу не мають таких привілеїв.


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