友元函数

友元可以是一个函数,叫友元函数;友元可以是一个类,叫友元类。

友元函数

友元关键字: 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;
}

results matching ""

    No results matching ""