友元分为友元函数和友元类两种
友元函数
一个类的友元函数可以访问该类的私有成员
#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 Called
Constructor Called
Destructor Called
Friend Called
10000
Destructor 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);//10000
return 0;
}
注意:友元类之间的关系不能传递,不能继承