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

Лекция № 9. Конструкторы и деструкторы

    1. Определение

Существует два способа определения целочисленной переменной. Можно сначала определить переменную, а затем (несколько ниже в программе) присвоить ей значение, например:

Int Weight;

Weight = 7;

Или, определив переменную, можно сразу инициализировать ее, например:

int Weight = 7;

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

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

Объявив конструктор, необходимо объявить и деструктор. Если конструкторы служат для создания и инициализации объектов класса, то деструкторы удаляют из памяти отработавшие объекты и освобождают выделенную для них память. Деструктору всегда присваивается имя класса с символом тильды (~) в начале. Деструкторы не принимают аргументы и не возвращают значения. Объявление деструктора класса Cat будет выглядеть следующим образом:

~Cat();

Доступны несколько типов конструкторов, одним из них передают параметры, другим – нет. Те, которые аргументов не получают, называются стандартными (default). Однако деструктор может быть только один. Никакие аргументы он не принимает.

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

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

Например, если для создания объекта класса Cat следует передать два параметра, то его определение будет выглядеть следующим образом:

Cat Frisky (5, 7);

Первым параметром в этом примере мог бы быть возраст кота, а вторым – его вес. Допустим, вместо предыдущей записи мы напишем:

Cat Frisky;

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

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

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

Листинг 9.1. Использование конструкторов и деструкторов

1: #include <iostream> //для cout

2:

3: class Cat //начало объявления класса

4: {

5: public: //начало раздела public

6: Cat(int initialAge); //конструктор

7: ~Cat(); //деструктор

8: int GetAge() const; //функция доступа

9: void SetAge(int age);//функция доступа

10: void Meow(); //обычная функция

11: private: //начало раздела private

12: int itsAge; //переменные-члены

13: };

14:

15: // Конструктор класса Cat

16: Cat::Cat(int initialAge)

17: {

18: itsAge = initialAge;

19: }

20:

21: Cat:: ~Cat() //деструктор, не делает ничего

22: {

23: }

24: // Реализация открытой функции доступа GetAge(),

25: // возвращающей значение элемента itsAge

26: int Cat::GetAge() const

27: {

28: return itsAge;

29: }

30:

31: // Реализация открытой функции

32: // доступа SetAge, устанавливающей значение

33: // элемента itsAge

34: void Cat::SetAge (int age)

35: {

36: // присвоить переменной-члену itsAge значение,

37: // переданное через параметр age

38: itsAge = age;

39: }

40: // Реализация метода Meow()

41: // Возвращает: ничего (void)

42: // Параметры: нет

43: // Действия: выводит на экран «Мяу» (Meow)

44: void Cat::Meow()

45: {

46: std::cout << “Meow.\n”;

47: }

48:

49: // Создать кота, установить его возраст, мяукнуть,

50: // сообщить его возраст, затем мяукнуть снова.

51: int main()

52: {

53: Cat Frisky (5);

54: Frisky.Meow();

55: std::cout << “Frisky is a cat who is “;

56: std::cout<<Frisky.GetAge()<< “ years old.\n”;

57: Frisky.Meow();

58: Frisky.SetAge(7);

59: std::cout << “Now Frisky is “;

60: std::cout<<Frisky.GetAge()<< “ years old.\n”;

61: return 0;

62: }

__________________________________________________________________

РЕЗУЛЬТАТ

Meow.

Frisky is a cat who is 5 years old.

Meow.

Now Frisky is 7 years old.