Программирование >>  Программирование на языке c++ 

1 ... 28 29 30 [ 31 ] 32 33 34 ... 159


объявляет указатель Р на объект класса my class и инициализирует его: выделяет память под новый объект класса my class с помощью оператора new; строит этот объект, используя заданный конструктор ( my class(ss,sizeof(ss)) ), и назначает значение указателю Р, которое теперь будет адресовывать построенный объект. Далее указатель Р можно использовать, например, так:

P->display();

Здесь вызывается функция displayO построенного объекта через указатель Р. Напомним, что если О - это объект и F0 - компонент-функция объекта О, то функция F вызывается с помощью выражения O.F(). Если же Р - это указатель на объект О, то функция F вызывается следующим образом: P->F().

Оператор delete Р; разрушает объект, на который указывает Р. В результате вызывается деструктор этого объекта. Объект А разрушается после завершения программы. Окончательно результаты работы Программы представляются в виде:

I am created: size = 100 I am created: size = 29 Computer Department of BSUIR I am destroyed: size = 29 Regards

I am destroyed: size = 100

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

-♦ деструктор имеет то же самое имя, что и класс, в котором он объявляется, с префиксом ~ (тильдой);

деструктор не возвращает значения (даже типа void);

-♦ деструктор не наследуется в производных классах;

-♦ производный класс может вызвать деструкторы для его базовых классов;

-♦ деструктор не имеет параметров (аргументов);

-♦ класс может иметь только один деструктор;

деструктор - это функция, и он может быть виртуальным (его можно объявить с ключевым словом virtual);



-♦ невозможно получить в программе адрес деструктора (указатель на деструктор);

-♦ если деструктор не задан в программе, то он будет автоматически сгенерирован компилятором для уничтожения соответствующих объектов. Все деструкторы, сгенерированные компилятором, имеют атрибут public;

-♦ деструктор можно вызвать так же, как обычную функцию, если использовать его полное имя, например, X *р; ... р->Х::~Х().

-♦ деструктор вызывается автоматически при разрушении . (уничтожении) объекта;

-♦ объект, содержащий деструктор, нельзя включить в виде компонента в объединение (union);

когда вызывается библиотечная функция exit, вызываются деструкторы только для глобальных объектов;

-♦ когда вызывается библиотечная функция abort, никакие деструкторы не вызываются;

-♦ если память под объект выделена через указатель с помощью оператора new (см. приведенный выше пример), то при прекращении существования этого указателя объект автоматически не разрушается. Для разрушения объекта надо использовать в программе оператор delete. Дополнительные правила использования деструкторов будут рассмотрены в § 3.12 и в гл. 4,5.

3.6. Встроенные функции (спецификатор inline)

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



void display string(void) { cout str endl; }

В этом примере функция display string - встроенная (inline функция). Компонент-функцию можно явно объявить со спецификатором inline в ее описании за пределами класса:

class string {

char str[25];

public:

void display string(void);

inline void string;: dispiay string(void) { cout str endl; }

Когда мы специфицируем функцию как inline, мы только выражаем компилятору наше пожелание. Однако окончательное решение обычно принимается компилятором, поскольку иногда введение встроенных функций оказывается невозможным или нежелательным.

3.7. Организация внешнего доступа

к локальным компонентам класса

(спецификатор friend)

В языке С++ одна и та же функция не может быть компонентом двух разных классов. Однако в некоторых ситуациях необходимо иметь доступ из одной функции к локальным

4 В. А. Скляров 97

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

class string {

char str[25]; public:



1 ... 28 29 30 [ 31 ] 32 33 34 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика