Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи Програмування C_.doc
Скачиваний:
46
Добавлен:
18.12.2018
Размер:
1.44 Mб
Скачать

4. Конструктор класу.

Те, що було зроблено у прикладах з класами Student та Polar_Point, коли дані екземпляру задавались «вручну» припустимо лише для прикладу, адже з одного боку можливо «забути» проініціалізувати деяку змінну екземпляру, а далі використати її (за замовчуванням проініціалізовану компілятором!), з іншого боку хотілося б взагалі мінімізувати «ручне» маніпулювання при створенні екземплярів класів. Іншими словами роботу по створенню та ініціалізації екземплярів треба перекласти на компілятор. Тому метод, подібний до OurMetod, має викликатись автоматично при створенні кожного екземпляру класу OurClass. Такий метод класу називається конструктором класу. Синтаксис його декларації наступний:

<специфікатор_доступу> <ідентифікатор_класу> (<параметри конструктора>)

{

// код конструктора

}

Наприклад, конструктор для класу з останнього прикладу міг би бути наступним:

public OurClass(double x_, int i_, char c_)

{

x = x_;

i = i_;

c = c_;

}

Зазвичай конструктору встановлюють специфікатор public, оскільки екземпляри створюються поза межами класу, отже, конструктор має бути відкритим. Зверніть увагу, ідентифікатор конструктора збігається з ідентифікатором класу, а тип результату у нього – відсутній, не вказується навіть службове слово void. Оскільки в нашому прикладі конструктор ініціалізує 3 даних-члени класу OurClass, список його параметрів складається з трьох. При створенні екземпляру класу OurClass тепер необхідно вказати в дужках список із трьох аргументів, якими конструктор проініціалізує дані-члени свого об’єкту. Пригадаймо, що раніше, коли ми ще не обговорювали конструктори, при створенні екземпляру після імені класу ми писали круглі дужки. Тепер стає зрозумілим зміст такого синтаксису. Адже конструктор для класу викликається при створенні екземпляру незалежно від того, визначений у класі конструктор, чи ні. Просто в останньому випадку спрацьовує так званий конструктор за замовчуванням, який не має параметрів та присвоює відповідні нульові значення всім членам класу value-типу та значення null (нульовий вказівник) членам класу reference-типу. Проте, як тільки у класі створений явний конструктор, конструктор за замовчуванням стає недоступним. Перетворимо попередній приклад та проаналізуємо результат роботи програми.

using System;

namespace Param_Metod

{

class OurClass

{

double x; // Всі дані-члени цього класу - закриті!

int i;

char c;

// Конструктор ініціалізує дані-члени класу значеннями

// аргументів; x_, i_, c_ - параметри конструктора OurClass

public OurClass(double x_, int i_, char c_)

{

x = x_;

i = i_;

c = c_;

}

public double Get_x()

{ return x; }

public int Get_i()

{ return i; }

public char Get_c()

{ return c; }

}

class Program

{

static void Main()

{ // Екземпляр створює конструктор з аргументами

OurClass cl = new OurClass(1, 1, 'A');

Console.WriteLine("x = {0}\ti = {1}\tc = {2}",

cl.Get_x(), cl.Get_i(), (char)cl.Get_c());

// Інший екземпляр з іншими аргументами

OurClass another_cl = new OurClass(1.5, 10, 'Z');

Console.WriteLine(

"x = {0}\ti = {1}\tc = {2}", another_cl.Get_x(),

another_cl.Get_i(), another_cl.Get_c());

// Тепер створити екземпляр без аргументів неможливо!

OurClass bad_cl = new OurClass();// Помилка!

}

}

}

Підведемо підсумки.

  1. Кожен клас має конструктор – метод одноіменний з класом, для якого не вказується тип результату. Конструктор автоматично викликається в момент створення екземпляру (об’єкту) класу. Аргументи для конструктора вказуються у круглих дужках.

  2. Якщо клас не містить явно визначеного конструктора, то викликається конструктор за замовчуванням (by default) з порожнім списком аргументів. Він зануляє дані-члени класу.

  3. Якщо в класі явно визначений конструктор, то конструктор за замовчуванням компілятором не використовується.

  4. Безпосередньо викликати конструктор неможливо – це прерогатива компілятора, який звертається до конструктора при створенні об’єкту класу.