友元函数提供了不同类的成员函数之间、 类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。
友元函数:
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外部的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称上加上friend的关键字,其格式为:
friend 类型 函数名(形式参数)
友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
一个函数可以是多个函数的友元函数,只需在各个类中分别声明。
友元函数的调用与一般函数的调用方式和原理一致。
友元类:
友元类的所有成员函数都是另一个类的友元函数。定义的格式如下:
friend class 类名:其中,friend和class是关键字,类名必须是程序中的一个已定义过的类。
#include <iostream>
using namespace std;
class Radius{
friend class Circle;
friend void show_r(Radius &n); //外部的函数show_r就可以私有变量r;不加的话就报错,不能访问
public:
Radius(int x){
r=x;
}
~Radius(){
}
private:
int r;
};
class Circle{
public:
Circle(){
s=0;
}
~Circle(){
}
double area(Radius a){
s=a.r*a.r*3.14;
return s;
}
private:
double s;
};
void show_r(Radius &n){
cout<<"圆的半径:"<<n.r<<endl;
}
int main() {
Radius objRadius(9);
Circle objCircle;
show_r(objRadius);
cout<<"面积为:"<<objCircle.area(objRadius)<<endl;
return 0;
}
使用友元类时注意:
(1) 友元关系不能被继承
(2) 友元关系是单向的,不具有交换性。若类b是类a的友元,类a不一定是类b的友元,要看在类中是否有 相应的声明。
(3)友元关系不具有传递性。若类b是类a的友元,类c是类b的友元,类c不一定是类a的友元。