友元函数要点
友元函数不是类的成员函数,但是仍可以访问该类的私有成员。友元函数可以是一个外部函数,也可以是另一个类的成员函数。
当类A中的某个函数成员需要访问类B中的私有成员的时候,首先需要在类A的头文件中进行对类B的超前使用说明,这是必不可少的。其次需要在类B中将A的函数声明为友元函数。
友元函数的声明就是在函数原型前面加上friend。
可以将一个类定义为另一个类的友元,但是这样的话,友元类中的所有函数成员都能访问另一个的类中的私有数据成员,这样是不安全的。最好的方法就是哪个需要访问,就设置为友元函数即可。
示例
//为了让aux类能够访问,需要超前声明budget类 class Budget; class Aux { private: float auxBudget; public: Aux(){auxBudget = 0;} float getAuxBudget(){return auxBudget;} //该函数将访问budget类中的私有数据成员,第二个参数是budget类的一个引用 void addBudget(float,Budget &); };
在budget类的public属性下的成员函数声明增加下面一句,将aux类中的addbudget函数声明为本类的友元函数。
//声明为友元函数 //其实就是告诉编译器,该函数可以访问本类中的私有数据成员 friend void Aux::addBudget(float,Budget &);
源文件中函数实现
//aux类中的函数成员访问budget类中的私有数据成员 void Aux::addBudget(float b,Budget &bud) { auxBudget+=b; bud.allBudget+=auxBudget; }
这样就可以在主函数中通过aux类的成员函数访问并修改budget类中的私有成员函数。但是这样也破坏了类的封装性。