Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy.docx
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
75.36 Кб
Скачать

14.Функции-друзья класса.

Дружественная функция - это функция, которая, не являясь компонентой класса, имеет доступ к его защищенным и собственным компонентам. Служит для расширения интерфейса класса. Описана в теле класса со спецификатором friend. friend имя_функции( список_формальных_параметров);

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

15. Функции-конструкторы. Явный и косвенный вызов конструктора.

Конструкторы предназначены для инициализации элементов данных объектов.

Описание конструктора: идентификатор_конструктора (список параметров) {тело конструктора}

Идентификатор конструктора должен совпадать с именем класса. У конструктора не указывается тип возвращаемого значения (даже void).

Для класса Massiv конструктор может быть объявлен так:

Massiv (int *b, int m)

{ n=m;

for (int i=0; i<n; i++)

a[i]=b[i];}

Конструктор может иметь значения параметров по умолчанию.

Правила использования конструкторов:

- если конструктор не вызывается явно, то он вызывается автоматически при создании объекта с использованием значений параметров по умолчанию;

- если конструктор не описан явно, он генерируется транслятором автоматически.

Вызывать конструктор можно так:

имя_класса имя_объекта = имя_конструктора (список фактических параметров);

имя_конструктора имя_объекта (список фактических параметров);

Конструктор выделяет память для объекта и инициализирует данные-члены класса.

Конструктор имеет ряд особенностей:

Для конструктора не определяется тип возвращаемого значения. Даже тип void не допустим.

Указатель на конструктор не может быть определен и соответственно нельзя получить адрес конструктора.

Конструкторы не наследуются.

Конструкторы не могут быть описаны с ключевыми словами virtual, static, const, mutable, volatile.

Конструктор всегда существует для любого класса, причем, если он не определен явно, он создается автоматически. По умолчанию создается конструктор без параметров и конструктор копирования. Если конструктор описан явно, то конструктор по умолчанию не создается. По умолчанию конструкторы создаются общедоступными (public).

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

имя_класса имя_объекта(фактические_параметры);

имя_класса(фактические_параметры);

Первая форма допускается только при не пустом списке фактических параметров. Она предусматривает вызов конструктора при определении нового объекта данного класса:

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

По умолчанию создается также конструктор копирования вида T::T(const T &), где T - имя класса. Конструктор копирования вызывается всякий раз, когда выполняется копирование объектов, принадлежащих классу. В частности он вызывается: когда объект передается функции по значению; при построении временного объекта как возвращаемого значения функции; при использовании объекта для инициализации другого объекта. Конструктор с одним аргументом может выполнять неявное преобразование типа своего аргумента в тип класса конструктора.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]