Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

5.5Специальный вид функций класса - конструкторы и деструкторы

C++/CLI. Из класса можно создать объекты с различными начальными значениями их данных. Среди данных могут оказаться и указатели, которым при создании объекта присваиваются адреса выделенных областей в куче. После использования объекты уничтожаются, а вся выделенная память освобождается.

Действия по инициализации и удалению объектов выполняют специальные функции класса - конструктор и деструктор.

Конструктор - это функция класса, основное назначение которой состоит в инициализации значений данных вновь создаваемого объекта. Имя конструктора всегда совпадает с именем класса. Конструктор вызывается всякий раз при объявлении объекта класса или при создании объекта с помощью оператора new или gcnew. Класс может иметь несколько перегруженных конструкторов. При создании объекта применяется тот конструктор, параметры которого обеспечивают установку требуемых начальных значений данных этого объекта. Конструктор не имеет возвращаемого значения. Конструкторы используются при создании объектов как в неуправляемой, так и в управляемой куче.

Деструктор - это функция класса, предназначенная для уничтожения ранее созданного объекта этого класса. Имя деструктора всегда совпадает с именем класса с предшествующим символом "~" (тильда). Деструктор автоматически вызывается, когда объект, созданный объявлением, выходит из области видимости (например, функция, в которой создан объект, завершила работу) или, когда объект, созданный оператором new, удаляется оператором delete. В деструкторе с помощью оператора delete освобождается память, ранее выделенная с помощью опбратора new в неуправляемой куче.

В нижеследующей программе приведены различные перегруженные конструкторы класса.

Пример 5.5.1. Перегруженные конструкторы.

////////////////////

// C+ + /CLI

#include "stdafx.h"

class A

{

int x;

public:

A(int x=1) {A::x= x;} // Параметр - значение переменной x

A(int *pX) {x= *pX;} // Параметр - указатель

A(A *pObj) {x= pObj -> GetX();} // Параметр - указатель объекта класса А

Int GetX() {return X;} // Возвратить значение закрытой переменной

void Set (int x=10) {A::x= x;} // Установить значение закрытой

void Set (A obj) {x= obj.GetX ();} // Параметр -объект класса А

Void ShowX () // Вывести значение переменной

{System::Console::WriteLine ("x= {0}", x.ToString());}

};

int main(array<System::String ^> ^args) // Функция main видна в файле

{

A objl;

objl.ShowX();

// Аргумент конструктора по умолчанию равен 1

A obj2(4);

obj2.ShowX();

// Аргумент - непосредственное данное

int k=5;

A obj3 (&k);

obj3.ShowX();

// Аргумент - адрес данного

A obj5 (&obj2); // Аргумент - адрес объекта

obj5.ShowX( );

obj5.Set(50); // Аргумент - непосредственное данное

obj5.ShowX();

obj5.Set(objl); // Аргумент - объект

obj5.ShowX();

}

Результат:

x= 1

x= 4

x= 5

x= 4

x= 50

x= 1

Можно описание конструктора вынести из описания класса, привязав это описание к классу с помощью оператора привязки. Например,

A::А (А *pObj) {x= pObj->GetX();} /* Конструктор не имеет возвращаемого

значения! */

оставив в классе его объявление

А (А *pObj);

Каждая функция класса неявно содержит указатель this

имя-класса *this;

Значение этого указателя равно значению адреса объекта класса, к которому относится данная функция. Мы будем активно использовать this при программировании оконных приложений.

А (А *pObj) {this->x=pObj->GetX ();}

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

Java и C#. Конструктор при создании объекта инициализирует значения данных и, в частности, с помощью оператора new выделяет области в управляемой куче, устанавливая при этом значения соответствующим ссылочным переменным. Как и в C++/CLI, имя конструктора совпадает с именем класса, он открытый (public) и не имеет возвращаемого значения.

В языке C# дозволяется деструктор. Аналогично имя деструктора начинается с тильды и совпадает с именем класса. Деструктор используется для выполнения действий непосредственно перед тем, как сборщик мусора удалит из памяти объект. В отличии от деструктора языка C++/CLI, который выполняется, когда объект удаляется оператором delete или выходит за пределы области видимости, в случае языка C# объект может быть удалён позднее сборщиком мусора. Поэтому время выполнения деструктора точно не известно в отличии от языка C++/CLI. Напомним, что в конструкторе языка C# имена параметров должны отличаться от имён других переменных тела конструктора.