📅  最后修改于: 2020-09-25 04:52:59             🧑  作者: Mango
数据隐藏是面向对象编程的基本概念。它限制了班级外部私人成员的访问。
同样,受保护的成员只能由派生类访问,并且不能从外部访问。例如,
class MyClass {
private:
int member1;
}
int main() {
MyClass obj;
// Error! Cannot access private members from here.
obj.member1 = 5;
}
但是,C++中有一个称为“ 朋友函数”的功能可以打破该规则,并允许我们从类外部访问成员函数。
同样,也有一个朋友类 ,我们将在本教程的后面部分学习。
朋友函数可以访问类的私有数据和受保护的数据。我们使用类主体内的friend
关键字声明一个friend 函数 。
class className {
... .. ...
friend returnType functionName(arguments);
... .. ...
}
// C++ program to demonstrate the working of friend function
#include
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()
是一个朋友函数 ,可以访问私有和公共数据成员。
尽管此示例使我们对朋友函数的概念有所了解,但并未显示任何有意义的用途。
更有意义的用途是对两个不同类的对象进行操作。那时,朋友函数会非常有帮助。
// Add members of two different classes using friend functions
#include
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
内的friend 函数正在使用ClassB
。但是,我们目前尚未定义ClassB
。
// inside classA
friend int add(ClassA, ClassB);
为此,我们需要在程序中ClassB
声明ClassB
。
// forward declaration
class ClassB;
我们还可以通过使用friend
关键字在C++中使用friend类。例如,
class ClassB;
class ClassA {
// ClassB is a friend class of ClassA
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
将某个类声明为朋友类时,该朋友类的所有成员函数都将成为朋友函数。
由于classB
是一个朋友类,因此我们可以从classB
内部访问classA
所有成员。
但是,我们无法从classA
内部访问ClassB
成员。这是因为C++中的朋友关系仅被授予而不被接受。
// C++ program to demonstrate the working of friend class
#include
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
和numB
的总和。
由于ClassB
是一个朋友类,因此我们可以在ClassB
内创建ClassA
对象。