Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Podbelsky_V_V_C_Bazovy_kurs.pdf
Скачиваний:
69
Добавлен:
02.06.2015
Размер:
1.73 Mб
Скачать

212

Г л а в а 1 1

 

 

такой конструктор нужно объявлять явно, что и сделано. Конструктор умолчания выполняет инициализацию полей класса в соответствии с теми значениями, которые указаны в декларации класса. Однако, в теле конструктора умолчания полям объекта можно было бы присвоить и другие значения.

Пример применения конструкторов класса (программа 11_07.cs):

static void Main()

{

Real number = new Real(303.0, 1); // Конструктор общего вида

number.display("number");

Real number1 = new Real(0.000321);// Конструктор приведения типов

number1.display("number1");

Real numCopy = new Real(number);// Конструктор копирования

number1 = number;

// Присваивание

ссылок

 

 

number.incrementM();

// Изменение

объекта

 

 

number.display("number");

 

number1.display("number1");

numCopy.display("numCopy"); // Копия сохранила

значение

 

 

Real numb = new Real();

// Конструктор умолчания

numb.display("numb");

 

}

 

 

Результат выполнения программы:

number

= 3,03000 * 10^03

 

number1 = 3,21000 * 10^-04

 

number

= 4,03000 * 10^03

 

number1 = 4,03000 * 10^03

 

numCopy = 3,03000 * 10^03

 

numb

= 8,00000 * 10^00

 

Классы как типы

213

 

 

11.7. Деструкторы и финализаторы

Деструктор — это член класса, где запрограммированы все действия, которые необходимо выполнить для уничтожения объекта класса. Объявление деструктора:

extern opt ~имя_класса( ) тело_деструктора

Как показано в формате, имя_деструктора — это имя класса

спрефиксом ~ (тильда). Других имен у деструкторов не бывает. Деструктор в классе может быть только один. Параметров у деструктора нет. Нет и возвращаемого значения. Тело деструктора это блок либо пустой оператор, обозначаемый символом точка

сзапятой. Пустой оператор в качестве тела деструктора используется в том случае, если деструктор снабжен модификатором extern. В противном случае тело деструктора – это блок, включающий операторы, необходимые для уничтожения объекта. Практически тело деструктора аналогично телу метода без параметров с возвращаемым значением типа void.

Деструктор выполняется после того как соответствующий объект класса перестает использоваться в программе. Вызов деструктора выполняется автоматически. Момент вызова конкретно не определен. Явно вызвать деструктор из кода программы нельзя.

Вследующей программе класс включает определение деструктора. Несмотря на то, что явно деструктор в программе не вызывается, его выполнение иллюстрирует результат следующей программы (11_08.cs).

// 11_08.cs деструктор using System;

class A { ~A() {

Console.WriteLine("Destructor!");

}

}

class Test

{

static void Main()

{

214

Г л а в а 1 1

 

 

A b = new A(); b = null;

}

}

Результат выполнения программы:

Destructor!

В архитектуре .NET деструкторы реализуются с помощью метода с названием Finalize(). Этот метод, называемый финализатором, подменяет в сборке реально использованный в коде деструктор. Программируя на уровне языка C#, можно не обращать на это внимание, но это важно понимать, если исследовать код на языке IL.

Деструктор нужен только в том классе, который требует для создаваемого объекта выделения неуправляемых ресурсов. Например, когда конструктор объекта связывает создаваемый объект с дескриптором файла или устанавливает сетевое соединение. Когда объект выходит из области определения, необходимы действия по освобождению дескриптора файла или сетевого соединения. Именно такие действия должен выполнять деструктор.

Контрольные вопросы

1.Назовите модификаторы класса, применяемые при отсутствии наследования.

2.Назовите возможные члены класса.

3.Какие элементы являются обязательными в объявлении нестатического поля?

4.Когда выполняется инициализация нестатических полей?

5.Каков статус доступа нестатического поля при отсутствии в его объявлении модификаторов доступа?

6.Можно ли объявить статическое поле с типом класса, которому оно принадлежит?

7.В каком случае в классе могут одновременно присутствовать одноименные статический и нестатический методы?

8.В каких случаях телом нестатического метода может быть пустой оператор?

9.Назовите возможные применения ссылки this.

Классы как типы

215

 

 

10.В каких методах ссылка this отсутствует?

11.Опишите формат объявления нестатического конструктора.

12.Перечислите модификаторы конструктора.

13.Объясните назначение инициализатора конструктора.

14.Перечислите виды конструкторов.

15.В каком случае конструктор умолчания (конструктор без параметров) создается автоматически?

16.Каков статус доступа у конструктора умолчания, встраиваемого в класс автоматически?

17.Что такое конструктор копирования?

18.Каким образом конструктор может обратиться к другому конструктору своего класса?

19.Объясните назначение деструктора.

20.Сколько деструкторов может быть в одном классе?

21.Что такое финализатор?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]