一、友元函数
友元函数和普通函数最大的区别在于友元函数可以直接访问类的私有成员和保护成员;
友元函数不属于类的成员函数,但是友元函数必须在类内部定义;
友元函数使用friend关键词声明;
友元函数能够实现类之间的数据共享,较少系统开销,提高效率,但是会破坏类的封装机制;
class FriendFunc
{
public:
FriendFunc();
~FriendFunc();
friend void friend_function(FriendFunc f1);
private:
int x;
int y;
protected:
int z;
};
void friend_function(FriendFunc f1)
{
//可以直接访问类的私有和保护成员
cout<<"x:"<<f1.x<<endl<<"y"<<f1.y<<endl<<"z:"<<f1.z<<endl;
}
二、友元类
类A可以声明类B是自己的友元类,那么在类A的成员函数中可以直接访问类B的私有成员和保护成员。
class Girl;
class Boy;
class Boy
{
public:
void disp_girl_info(Girl gl);
private:
int weight;
int age;
friend Girl;//友元类
};
class Girl
{
public:
void disp_boy_info(Boy by);
private:
int weight;
int age;
friend Boy;//友元类
};
void Boy::disp_girl_info(Girl gl)
{
cout<<"age:"<<gl.age<<endl<<"weight"<<gl.weight<<endl;
}
void Girl::disp_boy_info(Boy gl)
{
cout<<"age:"<<gl.age<<endl<<"weight"<<gl.weight<<endl;
}
也可以只声明类A的某个成员函数是类B的友元,这样做的好处是只有类A使用friend关键词声明的函数可以直接访问类B的保护成员和私有成员;
class Girl;
class Boy;
class Boy
{
public:
void disp_girl_info(Girl gl);
private:
int weight;
int age;
};
class Girl
{
public:
void disp_boy_info(Boy by);
private:
int weight;
int age;
friend void Boy::disp_girl_info(Girl gl);
};
void Boy::disp_girl_info(Girl gl)
{
cout<<"age:"<<gl.age<<endl<<"weight"<<gl.weight<<endl;
}