Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Константные методы

Вы уже сталкивались с применением модификатора const для защиты значений переменных от изменения. Можно сделать методы класса константными. Константные методы отличаются тем, что не изменяют значений полей своего класса. Для того, чтобы сделать функцию константной, необходимо указать ключевое слово const после прототипа функции, но до начала тела функции. Если объявление и определение функции разделены, то модификатор const необходимо указывать дважды – как при объявлении функции, так и при её определении. Те методы, которые лишь считывают данные из поля класса, имеет смысл делать константными, поскольку у них нет необходимости изменять значения полей объектов класса.

На примере улучшения предыдущей программы, рассмотрим теперь способ применения модификатора const с методами класса и их аргументами.

class Distance {

… идентично предыдущей программе

void showdist() const // вывод длины на экран

{ cout << feet << "'-" << inches << "''"; }

Distance plus(const Distance& ) const; // прототип

};

//---------------------------------------------------------------------------

Distance Distance:: plus (const Distance& a2) const

{

… идентично предыдущей программе

}

//---------------------------------------------------------------------------

int main()

{

… идентично предыдущей программе

}

В данной программе мы передаём аргумент в функцию (plus(const Distance& а2)) по ссылке (экономим память, т.к. ссылка это псевдоним) и хотим быть уверенными в том, что функция не изменит значения этого аргумента, в качестве которого при вызове выступает переменная d2 главной функции. Для этого параметр а2 функции plus(const Distance& а2) указывается с модификатором const в её объявлении и определении.

Модификатор const можно применять и для объектов класса (например, const Distance pole(300,0)). Если объект класса объявлен с модификатором const, он становится недоступным для изменения. Это означает, что для такого объекта можно вызывать только константные методы, поскольку только они гарантируют, что объект не будет изменён.

Деструкторы

Как мы уже видели, особый метод класса – конструктор – вызывается при создании объекта. Следовательно, можно догадаться, что существует другая функция, автоматически вызываемая при уничтожении объекта и называемая деструктором. Деструктор имеет имя, совпадающее с именем конструктора (а следовательно, и с именем класса) и предваряющееся символом ~ (тильда): class Primer {

private:

int data;

public:

Primer() : data(0) // конструктор

{ }

~Primer() // деструктор

{ }

};

Деструктор: не имеет аргументов и возвращаемого значения; не может быть объявлен как const или static; не наследуется; может быть виртуальным. Деструкторы применяются для освобождения памяти, занимаемой объектом. Если деструктор явным образом не определён, то компилятор автоматически создаёт пустой деструктор. Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически – иначе (если этого не сделать) при уничтожении объекта память, на которую ссылались его поля указатели, не будет помечена как свободная.

Указатель на деструктор определить нельзя. Без необходимости явно вызывать деструктор объекта не рекомендуется. Необходимо помнить, что деструктор вызывается автоматически, когда объект выходит из области видимости:

  • для локальных объектов деструктор вызывается при выходе из блока, в котором они объявлены;

  • для глобальных объектов деструктор вызывается как часть процедуры выхода из main;

  • для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.

Лекция 5 (11 стр.)