友元函数
友元可以是一个函数,叫友元函数;友元可以是一个类,叫友元类。
友元函数
友元关键字: friend
友元是c++中的一种朋友关系
如果我们把一个类中的变量修饰成private,那么其他的类都没有访问这个变量的权利,这种机制在某种情况下过于严格了。
举个例子:
有一个男孩类,他有2个成员变量薪水和零花钱
有一个女孩类
假如有这种情景:女朋友想访问男朋友的薪水和零花钱,但是男朋友又不想暴露薪水和零花钱给其他人,可是设置的是private,怎么办呢?这时友元类就派上用场了,我们只需要在男孩类的私有方法中用friend
关键字修饰,那么其他类只要实现了这个方法都可以访问了。
友元的作用是提高了程序的运行效率,因为它减少了类型检查和安全性检查等等,节约了时间,但是它破坏了类的封装性,还有一点需要注意,友元函数是没有this指针的。
友元函数又分全局友元函数和类成员友元函数。
我门可以理解:友元为c++类提供了一个定向暴露的功能。
#include <iostream>
class Boy;//前项声明
//class Girl
class Girl
{
public:
float getBoyChange(Boy& boy);
};
//class Boy
class Boy
{
public:
Boy(float salary,float change)
:salary(salary),change(change)
{
};
~Boy(){};
//全局友元函数
friend float getSalary(Boy& boy); //传入Boy的引用
//类成员友元函数
friend float Girl::getBoyChange(Boy& boy);
private:
float salary;//薪水
float change;//零花钱
};
//全局友元函数的实现: 类外实现就不需要加friend了
float getSalary(Boy& boy){
return boy.salary;
}
//类成员友元函数的实现(记得把类名加上,否则就成了全局的)
float Girl::getBoyChange(Boy& boy){
return boy.change;
};
int main(int argc, char const *argv[])
{
Boy tom(100000,200000);
//调用全局友元函数
std::cout<<getSalary(tom)<<std::endl;//100000
Boy scott(80000,60000);
Girl kitty;
std::cout<<kitty.getBoyChange(scott)<<std::endl;//60000
return 0;
}