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

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

public обеспечивает доступ ко всем классам, однако в некоторых ситуациях данную интерпретацию следует расширить. Такое расширение обеспечивается дружественными классами и функциями.

Правила работы с дружественными функциями:

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

Дружественная функция может быть обычной функцией или методом другого ранее определенного класса. Она не может быть дружественной нескольким классам.

Определим дружественные функции вне класса:

void Zamena_g (Ttochka_v_pole*P, double gnew)

{P → Fg = gnew:}

Пример вызова дружественной функции:

Zamena_g (& Point4, 20);

Дркужественные классы:

Пусть мы хотим сделать класс А дружественным другому классу В. Весь класс А нужно определить как дружественный классу В.

class B {

friend class A;

}

class A {

void f1 ( );

void f2 ( );

}

При таких объявлениях f1 и f2 будут дружественными классу В.

Общие замечания:

  1. спецификатор friend е является спецификатором доступа и не наследуется

  2. нужно осознавать, что использование дружественных функций и классов нарушает 1 из основных принципов ООП, а именно принцип инкапсуляции

Поэтому использование дружественных функций и классов следует избегать.

53. Перегрузка операций – общие положения.

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

Перегрузку операция можно объявить почти для всех операций кроме:

  • “•” – прямой вывод

  • “• *” – обращение к методу или полю

  • “?:”– условная тернарная операция

  • “::”– операция видимости

  • “sized” – определение размера объекта

  • “#”, “##”

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

  1. сохраняется арность, а также приоритетность операций и правило ассоциативности

  2. параметры функций операций не могут иметь значений по умолчанию

  3. функции операций наследуются, кроме операций присваивания

  4. функции операций не могут быть статическим

Перегрузка операций может быть определена как:

  • метод класса

  • дружественная функция

  • свободная функция

Указатели функции имеют единый формат:

<тип> оператор <знак операции> (<специфические параметры функции>) {<тело>} // здесь служебное слово «оператор» является обязательным.

Особенности синтаксиса различают варианты определения функции операции:

  • при определении функции в форме дружественной или свободной функции, хотя бы 1 из ее параметров должен относится либо классу, либо к ссылке на объект этого класса

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

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

Наиболее важные перегрузки используются только в 2-х видах: в виде метода и дружественной функции.

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