Дружественные функции C++ и дружественные классы
Другие функции C++ и дружественные классы
В этом руководстве мы научимся создавать дружественные функции и дружественные классы на C++ с помощью примеров.
Скрытие данных — фундаментальная концепция объектно-ориентированного программирования. Он ограничивает доступ закрытых членов из-за пределов класса.
Точно так же защищенные члены доступны только производным классам и недоступны извне. Например,
class MyClass {
private:
int member1;
}
int main() {
MyClass obj;
// Error! Cannot access private members from here.
obj.member1 = 5;
}
Однако в C++ есть функция, которая называется функции друзей. которые нарушают это правило и позволяют нам получать доступ к функциям-членам вне класса.
Точно так же существует класс друзей. а также, что мы узнаем позже в этом руководстве.
<час>функция друга в C++
Функция друга может получить доступ к личному и защищено данные класса. Мы объявляем функцию друга, используя friend
ключевое слово внутри тела класса.
class className {
... .. ...
friend returnType functionName(arguments);
... .. ...
}
<час> Пример 1:Работа функции друга
// C++ program to demonstrate the working of friend function
#include <iostream>
using namespace std;
class Distance {
private:
int meter;
// friend function
friend int addFive(Distance);
public:
Distance() : meter(0) {}
};
// friend function definition
int addFive(Distance d) {
//accessing private members from the friend function
d.meter += 5;
return d.meter;
}
int main() {
Distance D;
cout << "Distance: " << addFive(D);
return 0;
}
Вывод
Distance: 5
Здесь addFive()
— это функция друга, которая может получить доступ как к личным и общедоступно элементы данных.
Хотя этот пример дает нам представление о концепции функции друга, он не показывает никакого значимого использования.
Более осмысленным использованием было бы оперирование объектами двух разных классов. Вот когда функция друга может быть очень полезной.
<час>Пример 2. Добавление элементов двух разных классов
// Add members of two different classes using friend functions
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
private:
int numA;
// friend function declaration
friend int add(ClassA, ClassB);
};
class ClassB {
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
private:
int numB;
// friend function declaration
friend int add(ClassA, ClassB);
};
// access members of both classes
int add(ClassA objectA, ClassB objectB) {
return (objectA.numA + objectB.numB);
}
int main() {
ClassA objectA;
ClassB objectB;
cout << "Sum: " << add(objectA, objectB);
return 0;
}
Вывод
Sum: 13
В этой программе ClassA
и ClassB
объявили add()
как функция друга. Таким образом, эта функция может получить доступ к частным данные обоих классов.
Здесь следует обратить внимание на функцию друга внутри ClassA
. использует ClassB
. Однако мы не определили ClassB
на данный момент.
// inside classA
friend int add(ClassA, ClassB);
Чтобы это работало, нам нужно предварительное объявление ClassB
в нашей программе.
// forward declaration
class ClassB;
<час> класс друга в C++
Мы также можем использовать дружественный класс в C++, используя friend
ключевое слово. Например,
class ClassB;
class ClassA {
// ClassB is a friend class of ClassA
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
Когда класс объявляется дружественным классом, все функции-члены дружественного класса становятся дружественными функциями.
Начиная с ClassB
является дружественным классом, мы можем получить доступ ко всем членам ClassA
изнутри ClassB
.
Однако мы не можем получить доступ к членам ClassB
изнутри ClassA
. Это потому, что дружеские отношения в C++ только предоставляются, а не принимаются.
Пример 3:Дружественный класс C++
// C++ program to demonstrate the working of friend class
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
private:
int numA;
// friend class declaration
friend class ClassB;
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
};
class ClassB {
private:
int numB;
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
// member function to add numA
// from ClassA and numB from ClassB
int add() {
ClassA objectA;
return objectA.numA + numB;
}
};
int main() {
ClassB objectB;
cout << "Sum: " << objectB.add();
return 0;
}
Вывод
Sum: 13
Здесь ClassB
является дружественным классом для ClassA
. Итак, ClassB
имеет доступ к членам classA
.
В ClassB
, мы создали функцию add()
который возвращает сумму numA и числоB .
С ClassB
является дружественным классом, мы можем создавать объекты ClassA
внутри ClassB
.
Язык C