Разработка объектно-ориентированного приложения с использованием класса Directory, страница 4

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

1.4 Функции

Функция– это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение. Любая программа состоит из функций, одна из которых должна иметь имя main, с нее начинается выполнение программы.

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

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

Рассмотрим составные части определения:

[класс] тип имя ([список_параметров])[throw (исключения)]

{ тело функции }

-  с помощью необязательного модификатора класс можно явно задать область видимости функции, используя ключевые слова extern (глобальная видимость во всех модулях программы) и static (видимость только в пределах модуля, в котором определена функция);

-  тип возвращаемого функцией значения может быть любым, кроме массива и функции. Если функция не должна возвращать значение, указывается тип void;

-  список параметром определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя;

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

1.5 Дружественные функции класса

Как было отмечено ранее, механизм управления доступом позволяет выделить внутренние private, защищенные protected и общедоступные public компоненты классов. Причем внутренние компоненты локализованы в классе и не доступны извне, а защищенные – доступны только компонентным функциям класса и его наследникам. Такое ограничение доступа к внутренним и защищенным компонентам класса может оказаться неоправданно строгим. Оно может существенно сужать возможности наследования других классов от данного и сокращать количество вариантов его использования. Кроме того, бывают случаи, когда функции, не являющиеся компонентными, должны иметь возможность обращаться к внутренним компонентам класса. В такой ситуации класс может предоставить особые привилегии определенным внешним функциям или компонентным функциям другого класса. Эти функции получили название дружественных.

По определению, дружественной функцией класса называется функция, которая, не являясь компонентом некоторого класса, имеет доступ ко всем его компонентам, в том числе внутренним. Функция не может стать другом класса «без его согласия». Для получения «прав друга» функция должна быть описана в теле класса со спецификатором friend. Именно при наличии такого описания класс предоставляет функции права доступа к защищенным и внутренним компонентам.

Друзьями класса могут являться и компонентные функции другого класса.

Следует отметить некоторые особенности дружественных функций. Дружественная функция при вызове не получает указатель this, поскольку не является компонентной. Объекты класса должны передаваться дружественной функции явно (через параметры). Так как дружественная функция не является компонентом класса, на нее не распространяется действие спецификаторов доступа public, protected, private. Поэтому место размещения прототипа дружественной функции внутри определения класса безразлично. Права доступа дружественной функции не изменяются и не зависят от спецификаторов доступа.