Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию
Содержание
- 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. Выделение памяти для типов-значений, структур, перечислений, объектов классов. Выделение памяти для массивов