Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию

Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию


Содержание


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

 


Связанные темы