У деструктора нет аргументов, и он не перегружается (у класса может
быть только один деструктор).
Наличие или отсутствие явно описанных конструкторов напрямую влияет
на способы создания объектов класса. Все дело в том, что команда создания
объекта выглядит на самом деле как new конструктор_класса(аргументы).
Другими словами, то, что мы ранее называли «имя класса», в команде созда-
ния объекта является на самом деле идентификатором конструктора клас-
са. В скобках указываются аргументы, которые передаются конструктору.
Если конструкторы явно в классе не описаны, используется конструк-
тор по умолчанию, у которого нет аргументов.
Конструкторы и деструкторы 65
Чтобы не быть голословными, сразу рассмотрим пример класса, в котором
есть и конструкторы, и деструктор. Программный код приведен в листин-
ге 2.4.
ПРИМЕЧАНИЕ Мы создаем Windows-проект, со всеми вытекающими отсюда по-
следствиями. Соответствующая процедура описывалась в первой
главе книги.
Листинг 2.4. Класс с конструкторами и деструкторами
using System.Windows.Forms;
class License{
// Закрытые поля класса:
string name;
int number;
char category;
// Конструктор класса с тремя аргументами:
public License(string name,int number,char category){
// Полям присваиваются значения.
// Ключевое слово this является ссылкой на объект,
// из которого вызывается метод
// (в данном случае конструктор):
this.name=name;
this.number=number;
this.category=category;
// Отображаем результат — окно
// со значениями полей:
show();
}
// Конструктор с одним тестовым аргументом:
public License(string name){
// Присваиваем полям значения:
this.name=name;
this.number=10000;
this.category='B';
// Отображаем результат — окно
// со значениями полей:
show();
}
// Конструктор создания "копии" — создание
// объекта на основе
// уже существующего объекта того же класса:
public License(License obj){
продолжение
66
Глава 2. Классы и объекты
Листинг 2.4 (продолжение)
// Значения полей создаваемого объекта
// формируются на основе
// полей объекта-аргумента конструктора:
name=obj.name+" - дубликат";
number=obj.number+1;
category=obj.category;
// Отображаем результат — окно
// со значениями полей:
show();
}
// Деструктор класса:
~License(){
// Формируем текст для отображения
// в окне сообщения:
string txt="Удаление объекта!\n"+getInfo();
// Отображение окна с сообщением
// об удалении объекта:
MessageBox.Show(txt,"Удаление",MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// Закрытый метод для формирования
// текстовой информации на основе
// значений полей объекта:
string getInfo(){
// Начальное значение формируемого текста,
// '\t' — символ табуляции,
// '\n' — переход к новой строке:
string text="Имя:\t"+name+"\n";
text=text+"Номер:\t"+number+"\n";
text=text+"Категория: "+category;
// Метод возвращает результат:
return text;
}
// Метод для отображения окна с сообщением:
public void show(){
// Формируем текст для сообщения:
string txt=getInfo();
// Отображаем окно сообщения:
MessageBox.Show(txt,"Лицензия",MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
class LicenseDemo{
// Главный метод программы:
public static void Main(){
Конструкторы и деструкторы 67
// Две объектные переменные:
License Lic1,Lic2;
// Создание объекта с помощью конструктора
// с тремя аргументами:
Lic1=new License("Иванов И.И.",11111,'A');
// Создание объекта с помощью конструктора
// создания "копии":
Lic2=new License(Lic1);
// Создание объекта с помощью конструктора
// с одним текстовым аргументом:
Lic2=new License("Петров П.П.");
}
}
У класса License есть три закрытых поля: текстовое (тип string) поле
name, целочисленное (тип int) поле number и символьное (тип char) поле
category. Все вместе представляют собой бледную аналогию водитель-
ской лицензии. У класса есть несколько конструкторов. В частности, есть
конструктор с тремя аргументами. Этот конструктор описан с сигнатурой
License(string name,int number,char category) (и атрибутом public).
Каждый из трех аргументов соответствует полю класса. Более того, аргу-
менты конструктора имеют такие же названия, как названия полей класса.
Поэтому мы столкнулись с неожиданной проблемой: как различить в про-
граммном коде конструктора имена полей и имена аргументов? Ответ
прост и состоит в том, что ссылки на поля следует выполнять с помощью
ключевого слова this, которое обозначает объект, из которого вызывается
метод (или конструктор, как в нашем случае, — ведь конструктор это тоже
метод). Например, ссылка на поле name может быть выполнена как this.