Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП_ЛабРаботы.doc
Скачиваний:
13
Добавлен:
28.09.2019
Размер:
716.8 Кб
Скачать

Конструкторы и деструкторы

Среди всех методов любого класса выделяются два (конструктор и деструктор), которые определяют, каким образом объекты класса создаются, инициализируются, копируются и разрушаются.

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

Деструктор используется для освобождения памяти, занимаемой членами класса. Особенно важную роль играет деструктор в случае динамического выделения памяти из области heap. Как известно, такую память следует явно освобождать операцией delete. Если тело деструктора создано, то он сделает это автоматически, как только закончит работу функция, в которой определен объект данного класса. Он неявно вызывается в случае выхода программы из области действия объекта. Деструктор носит имя класса, в котором он определен, но перед его именем должен стоять символ ~. Например, описание А::~А(){}; задает деструктор класса А, а А::А(){}; определяет его конст­руктор.

Конструкторы и деструкторы наряду с характеристиками обычных методов обладают и некоторыми уникальными свойствами:

  • Конструктор всегда имеет то же имя, что и сам класс; это же относится и к деструктору, которому, однако, предшествует символ "~" (тильда).

  • Не имеют объявлений возвращаемых значений (даже void).

  • Конструкторы, как и большинство функций C++, могут иметь аргументы по умолчанию или использовать списки инициализации элементов.

  • Если конструкторы или деструкторы не были определены явно, они ге­нерируются компилятором.

  • Конструктор нельзя вызывать как обычную функцию; вызов деструктора возможен с полностью уточненным именем.

  • При определении и разрушении объектов вызов конструкторов и дест­рукторов осуществляется автоматически.

  • Конструкторы и деструкторы, при необходимости выделения объекту па­мяти, могут выполнять неявные вызовы операций new и delete.

Правила, по которым происходит соз­дание/уничтожение объектов:

  • Конструкторы и деструкторы автоматически запускаются всякий раз при создании и разрушении объектов.

  • Глобальные и локальные статические объекты создаются в начале вы­полнения программы — до того, как управление попадает в функцию main. Уничтожение таких объектов происходит в момент завершения программы в результате возврата из функции main.

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

  • Конструктор объекта, память которому выделяется в куче (посредством операции new), вызывается автоматически, при вызове new; такой объект разрушается при явной передаче объекта в оператор delete.

// Простой пример, демонстрирующий последовательность вызовов конструкторов и деструкторов

#include <stdio.h>

#include <string.h>

// Объявляем класс

class Sample{

private: // К этим данным доступ возможен только посредством методов класса

char *strName;

public: // К этим данным доступ возможен из любого места программы

// Определяем простой конструктор

Sample (char *str) {

strName = new char [strlen (str) + 1] ;

strcpy(strName, str);

printf("Entry in constructor for %s\n", strName);

}

// Определяем деструктор

~Sample(){

printf("Entry in destructor for %s\n", strName);

delete strName;

strName = 0;

}

};

Sample globall("global #1"); // Определяем первый глобальный объект

// "Глупая" функция, иллюстрирующая создание автоматического объекта

void SillyFunc(){

// Определяем объект, локальный для данной функции

Sample fnAuto("automatic function");

printf("Function SillyFunc()\n");

}

int main(int argc, char* argv[])

{

// Определяем первый локальный объект

Sample autol("automatic #1");

printf("Begin main()\n");

SillyFunc();

// Определяем второй локальный объект

Sample auto2("automatic #2");

printf("Continue main()\n");

return 0;

}

Sample global2("global #2"); // Определяем второй глобальный объект

Результаты работы программы:

Entry in constructor for global #1

Entry in constructor for global #2

Entry in constructor for automatic #1

Begin main()

Entry in constructor for automatic function

Function SillyFunc()

Entry in destructor for automatic function

Entry in constructor for automatic #2

Continue main()

Entry in destructor for automatic #2

Entry in destructor for automatic #1

Entry in destructor for global #2

Entry in destructor for global #1

Press any key to continue

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

Некоторые конструкторы играют особую роль.