Выбрать главу

 У деструктора нет аргументов, и он не перегружается (у класса может

быть только один деструктор).

Наличие или отсутствие явно описанных конструкторов напрямую влияет

на способы создания объектов класса. Все дело в том, что команда создания

объекта выглядит на самом деле как 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.