1、 友元函数
- 友元函数是可以直接访问类的私有成员的非成员函数。
- 它是定义在类外的普通函数,它不属于任何类;
- 友元函数也可是其他类的成员函数(包括析构函数与构造函数)
- 友元函数需要在类中声明,声明时只需在友元的名称前加上关键字friend。友元函数在类外定义。
- 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
- 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
- 友元函数的调用与一般函数的调用方式和原理一致。
- 友元函数可以访问该类内部的私有成员
友元函数的声明格式如下:
friend 类型 函数名(形式参数);
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
class car;//声明类car,为了方便drive类使用
class drive{
public :
void modifyCar(car *pcar);
};
class car{
private:
int price;
friend int mostExpensiveCar(car cars[],int total);//声明友元函数
friend void drive::modifyCar(car *pcar);//声明友元
public :
car(int x)
{
price=x;
}
};
void drive::modifyCar(car *pcar)
{
pcar->price+=1000;
}
int mostExpensiveCar(car cars[],int total)
{
int max=-1;
for (int i=0;i<total;i++)
{
if(max<cars[i].price)
max=cars[i].price;
}
return max;
}
int main()
{
car cars[3]={1,2,3};
drive d;
cout<<mostExpensiveCar(cars,3)<<endl;
d.modifyCar(&cars[0]);
cout<<mostExpensiveCar(cars,3)<<endl;
return 0;
}
程序结果:
3
1001
2、友元类
如果A是B的友元类,那么A的成员函数可以访问B的私有成员
class B{
friend class A;
}友元类不能传递
A 是B的友元类,B是C的友元类,不能推出A是C的友元- 友元类不能继承
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
class car;//声明类car,为了方便drive类使用
class drive{
public :
void modifyCar(car *pcar);
};
class car{
private:
int price;
friend class drive;//声明友元类
public :
car(int x)
{
price=x;
}
};
void drive::modifyCar(car *pcar)
{
pcar->price+=1000;
cout<<"car price is :"<<pcar->price<<endl;
}
int main()
{
car cars[3]={1,2,3};
drive d;
d.modifyCar(&cars[0]);
return 0;
}
实验结果:
1001