Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ООАП.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
735.74 Кб
Скачать

17.Конструкотр и деструктор.

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

имя_класса имя_объекта ( фактические_параметры_конструктора );

имя_класса * имя_указателя = new имя_класса(фактические_ параметры_ конструктора );

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

//Листинг 6. Конструкторы по умолчанию

struct MyClass

{//конструкторы по умолчанию (создаются компилятором)

MyClass() // без параметров

{…}

MyClass(MyClass &copy) //конструктор копирования

{…}

};

main()

{

MyClass m; //вызов конструктора без параметров

MyClass m1(m);//вызов конструктора копирования

}

Конструктор копирования используется для копирования объектов класса. Можно выделить следующие случаи вызова конструктора копирования:

а) при создании экземпляра класса на основе уже существующего объекта;

а) при передаче объекта класса в функцию по значению;

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

Конструктор копирования по умолчанию копирует значения объектов поразрядно. Для класса array конструктор копирования должен создать свой динамический массив и поэлементно скопировать значения:

array(array &copy) //конструктор копирования

{ n=copy.n

mas=new int[n];

for(int i=0;i<n;i++)

mas[i]=copy.mas[i];

}

Для класса array вместо метода InitMas необходимо определить конструктор, который выделял бы динамически память под массив.

//Листинг 7. Переопределение класса «массив целых чисел» с использованием

//конструктора

struct array

{ …

array(int k)

{if(k>0)

{ n=k;

mas=new int[n];

}

else

{cout<<Неверный размер массива”;

n=0;

}

}

};

main()

{ array m(5); //вызов конструктора. Память выделяется под 5 элементов массива

m.ReadMas(); //ввод элементов массива с клавиатуры

}

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

имя_компонента (выражение)

Например, для класса array можно было определить конструктор так:

class array

( .....

public:

array ( int k) : n(k)

{mas=new int[n] ;

}

};

Еще одним специальным методом класса является деструктор. Деструктор вызывается перед освобождением памяти, занимаемой объектной переменной, и предназначен для выполнения дополнительных действий, связанных с уничтожением объектной переменной, например, для освобождения динамической памяти, закрытия, уничтожения файлов и т.п.

Объявление деструктора в классе выглядит следующим образом:

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

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

//Листинг 8. Вызов деструктора объекта

main()

{

MyClass m; //создание объекта статически

MyClass *ptm=new MyClass; //создание объекта динамически

delete ptm; //вызов деструктора для динамического объекта

//вызов деструктора для статического объекта

}

Определим деструктор для класса array.

struct array

{ …

~array()

{ if(n>0)

delete []mas;

}

};

Деструктор в отличие от конструктора допускает явный вызов вида:

имя_обекта.~имя_класса()

адрес_объекта->~имя_класса()

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