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

Дружественные функции класса определяются вне области действия этого класса, но имеют право доступа к закрытым элементам private (и к элементам protected) данного класса.

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

  • дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым слово friend. В качестве параметра ей должен передаваться объект, ссылка или указатель на объект класса, поскольку указатель this ей не передается.
  • дружественная функция может быть обычной функцией или методом ранее определенного класса. На нее не распространяется действие спецификаторов доступа, место размещения ее объявления в классе безразлично.
  • одна функция может быть дружественной сразу нескольким классам.

Использование механизма дружественных функций позволяет упростить интерфейс между классами. Например, дружественная функция позволит получить доступ к собственным или защищенным данным и методам сразу нескольких классов. Тем самым из классов можно иногда убрать методы, предназначенные только для доступа к этим "скрытым" полям данных и методам.

Рассмотрим пример: программа демонстрирует объявление и использование дружественной функции setX для установки закрытого элемента класса ClassOne.

 

//Листинг 16.1

#include<iostream>

using namespace std;

class ClassOne{

int x; //элемент данных

friend void setX(ClassOne &,int); //объявление друга

public:

ClassOne() {x=0;} //конструктор

void print() const {cout<<x<<"\n";} //вывод

};

 

//Можно изменять закрытую переменную класса ClassOne, так как setX //объявлена как дружественная функция класса ClassOne

void setX(ClassOne &c, int val)

{c.x=val; } //разрешено,т.к. setX - друг ClassOne

int main()

{ ClassOne object;

object.print();

setX(object,8); //задание x другом

object.print();

return 0;

}

Результаты выполнения программы:


Перегрузка операций

С++ позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции.

Формат определения функции-операции:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: