Введение в функцию друзей в C ++

Уникальная особенность программы на C ++ состоит в том, что она использует инкапсуляцию, чтобы объединить данные со всеми своими операционными функциями, образуя отдельный объект. Это гарантирует, что к конкретным данным могут получить доступ только те задачи, которые работают с ними, а не любая другая задача за пределами этого класса. Следовательно, в случаях, когда внешнему классу может понадобиться доступ к этим конкретным данным, мы используем эту специальную функцию, называемую «другом». Мы знаем, что, используя такие ключевые слова, как «защищенный» и «частный», мы не можем получить доступ к этим данным вне его метода. Но ради приложения реального времени во многих случаях нам могут понадобиться одни и те же личные / защищенные данные, и использование уже объявленных данных всегда предпочтительнее, чем их многократное создание. Давайте посмотрим, как объявить и использовать функцию Friend в C ++ в этой статье.

Функция друга при объявлении предшествует ключевому слову «друг», как показано здесь:

Синтаксис :

class (
private
protected
friend (arguments list);
)
returnDatatype functionName(arguments list)(
//function from which protected and private keywords
//can be accessed from as this is a friend method of className
)
class (
private
protected
friend (arguments list);
)
returnDatatype functionName(arguments list)(
//function from which protected and private keywords
//can be accessed from as this is a friend method of className
)

Как показано в приведенном выше коде, функция друга должна быть объявлена ​​в том же классе, где было объявлено ключевое слово protected или private, чтобы эти данные были доступны за пределами класса. Эта функция может быть объявлена ​​где угодно во всей программе, как обычный метод C ++. Определение функции не требует таких ключевых слов, как друзья или операторы разрешения области видимости.

Примеры функции Friend в программе C ++

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

Пример № 1

Код:

/* C++ program which exhibits the working of friend function.*/
#include
using namespace std;
class Weight
(
private:
int kilo;
public:
Weight(): kilo(0) ( )
//Declaration of a friend function
friend int addWeight(Weight);
);
// Defining a friend function
int addWeight(Weight w)
(
//accessing private data from non-member function
w.kilo += 17;
return w.kilo;
)
int main()
(
Weight W;
cout<<"Weight: "<< addWeight(W);
return 0;
)

Выход:

Здесь дружественной функцией является метод addWeight (), который объявлен внутри класса Weight. Kilo - это ключевое слово private, объявленное внутри метода Weight, которое затем вызывается из функции addWeight. Этот пример был просто для демонстрации базового использования функции друга, хотя здесь нет использования в реальном времени. Давайте теперь углубимся в некоторые содержательные примеры.

Пример № 2

Код:

#include
using namespace std;
// Forward declaration
class SecondClass;
class FirstClass (
private:
int first_num;
public:
FirstClass(): first_num(12) ( )
// Declaring a friend function
friend int divide(FirstClass, SecondClass);
);
class SecondClass (
private:
int sec_num;
public:
SecondClass(): sec_num(4) ( )
// Another friend declaration
friend int divide(FirstClass, SecondClass);
);
// Function divide() is the friend function of classes FirstClass and SecondClass
// that accesses the member variables first_num and sec_num
int divide(FirstClass fnum, SecondClass snum)
(
return (fnum.first_num / snum.sec_num);
)
int main()
(
FirstClass fnum;
SecondClass snum;
cout<<"The value got by dividing first by second number: "<< divide(fnum, snum);
return 0;
)

Выход:

В этом примере у обоих классов FirstClass и SecondClass есть функцияdiv (), объявленная в качестве функции-друга. Следовательно, эта функция может получить доступ к данным закрытых переменных из обоих классов. Здесь функцияdiv () используется для добавления приватных переменных first_num и sec_num двух объектов fnum и snum и возвращает их значение методу main.

Для того, чтобы это работало правильно, необходимо сделать предварительное объявление для SecondClass, как показано в коде, потому что SecondClass ссылается в FirstClass с помощью программы:

friend int divide(FirstClass, SecondClass);

Класс Friend: есть класс Friend, как и функция Friend . Класс Friend также может обращаться как к закрытым, так и к защищенным переменным класса, поскольку он является его другом.

Синтаксис :

class One(
friend class Two;
);
class Two(
);
class One(
friend class Two;
);
class Two(
);
class One(
friend class Two;
);
class Two(
);

Как показано выше, класс Два является другом класса Один. Следовательно, класс Два может обращаться к закрытым и защищенным переменным класса Один. Но класс Один не может получить доступ к защищенным или закрытым переменным класса Два, потому что это не взаимная дружба. Для взаимной дружбы мы должны заявить об этом явно. Таким же образом, эта дружба класса не наследуется, что означает, что класс Два не должен быть другом подклассов класса Один, даже если он является другом класса Один.

Пример № 3

Код:

#include
#include
using namespace std;
class Perimeter(
int len, brd, perimeter, temp;
public:
Perimeter(int len, int brd):len(len), brd(brd)
()
void calcPerimeter()(
temp = len + brd;
perimeter = 2 * temp;
)
friend class printClass;
);
class printClass(
public:
void printPerimeter(Perimeter a)(
cout<<"Perimeter = "< )
);
int main()(
Perimeter a(10, 15);
a.calcPerimeter();
printClass p;
p.printPerimeter(a);
return 0;
)
#include
#include
using namespace std;
class Perimeter(
int len, brd, perimeter, temp;
public:
Perimeter(int len, int brd):len(len), brd(brd)
()
void calcPerimeter()(
temp = len + brd;
perimeter = 2 * temp;
)
friend class printClass;
);
class printClass(
public:
void printPerimeter(Perimeter a)(
cout<<"Perimeter = "< )
);
int main()(
Perimeter a(10, 15);
a.calcPerimeter();
printClass p;
p.printPerimeter(a);
return 0;
)

Выход:

В этом коде у нас есть 2 класса: класс периметра, который находит периметр, используя значения длины и ширины. Переменные len, brd, perimeter и temp являются частными переменными периметра класса. Следовательно, нам нужно сделать printClass другом класса Perimeter. Этот printClass использует значение Perimeter, вычисленное в функции calcPerimeter () в классе Perimeter. Поскольку они все являются частными членами, мы должны сделать printPerimeter другом класса Perimeter. Как только это будет сделано, мы должны создать объект в главном классе для вычисления периметра и передать этот объект в класс printPerimeter для отображения периметра.

Особенности функции Friend в C ++

  • Метод и класс, которому он был объявлен как друг, не обязательно должны совпадать.
  • Поскольку он не входит в область действия соответствующего класса, его нельзя вызвать с помощью его объекта.
  • Он также может быть вызван как обычный метод, даже без использования объекта.
  • Он может напрямую обращаться только к именам членов, используя свое имя объекта и оператор членства в точках вместе с именем члена.
  • Ограничений нет, так как они могут быть объявлены как в частной, так и в публичной части.

Вывод

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

Рекомендуемая статья

Это руководство к функции Friend в C ++. Здесь мы обсуждаем функцию Введение в Friend в C ++ и ее примеры, а также реализацию и вывод кода. Вы также можете просмотреть наши предлагаемые статьи, чтобы узнать больше -

  1. Рекурсивная функция в C ++ (примеры)
  2. Топ 11 возможностей C ++
  3. Библиотека машинного обучения C ++
  4. Функция хеширования в C с типами
  5. Функция хеширования в PHP с синтаксисом