友元分为友元函数和友元类两种
友元函数
一个类的友元函数可以访问该类的私有成员
#include <bits/stdc++.h>using namespace std;class car;//提前声明car类,便于之后的使用class driver{public:void ModifyCar(car*);};class car{private:int price;public:car(int);friend void driver::ModifyCar(car *);//声明友元函数void getCar(void);~car(void);};void driver::ModifyCar(car *pCar){pCar->price+=1000;cout<<"Friend Called"<<endl;}car::car(int x){price=x;cout<<"Constructor Called"<<endl;}void car::getCar(void){cout<<price<<endl;}car::~car(void){cout<<"Destructor Called"<<endl;}int main(void){car c(5000);//初始化对象,构造函数调用c=9000;//类型转换生成临时对象,构造函数析构函数都调用driver d;d.ModifyCar(&c);//ModifyCar虽然是driver类的成员函数,由于之前将其声明为了car类的友元c.getCar(); //现在通过它也可以访问car类的私有成员return 0;}/*Constructor CalledConstructor CalledDestructor CalledFriend Called10000Destructor Called*/
友元类
如果A是B的友元类,则A的成员函数可以访问B的私有成员
#include <bits/stdc++.h>using namespace std;class car{private:int price;public:car(int);friend class driver;};class driver{public:void ModifyCar(car*);void GetCar(const car&);};car::car(int x){price=x;}void driver::ModifyCar(car *pCar){pCar->price+=1000;}void driver::GetCar(const car &qCar){cout<<qCar.price<<endl;}int main(void){car C(9000);driver d;d.ModifyCar(&C);d.GetCar(C);//10000return 0;}
注意:友元类之间的关系不能传递,不能继承
