C++为了进一步提高数据共享,通过友元机制实现类外数据共享。
友元不是该类的成员函数,但是可以访问该类的私有成员。
• 对于一个类而言,它的友元是一种定义在该类外部的:
– 普通函数, 或者– 另一个类的成员函数, 或者– 另一个类,
但需要在该类体内进行说明。
将一个函数声明为一个类的友元函数后,它不但可以通过对象名访问类的公有成员,而且可以通过对象名访问类的私有成员和保护成员
访问对象中的成员必须通过对象名
友元函数近似于普通的函数,它不带有this指针, 因此必须将对象名或对象的引用作为友元函数的参数,这样才能访问到对象的成员。
友元函数可以访问该类中的所有成员(公有的、私有的和保护的) ,而一般函数只能访问类中的公有成员
- #include <iostream>
- using namespace std;
- class A{
- float x, y;
- public:
- A(float a, float b){x=a; y=b;}
- float GetX(){return x;}
- float GetY(){return y;}
- float Sum(){ return x+y; } //成员函数
- friend float Sum(A &a); //友元函数声明
- } ;
- float Sum(A &a) { return a.x + a.y; } //友元函数定义
- float SumXY(A &a) //普通函数定义
- {
- return a.GetX()+a.GetY();
- }
- int main(){
- A t1(4,5), t2(10,20), t3(100,200);
- cout<<t1.Sum()<<endl; //成员函数的调用,利用对象名调用
- cout<<Sum(t1)<<endl; //友元函数的调用,直接调用
- cout<<SumXY(t1)<<endl; //调用一般函数
- return 0;
- }
当一个类作为另一个类的友元时,就意味着这个类的所有成员函数都是另一个类的友元函数
假设有两个无关系的类engine 和fuel,使用时,怎样允许fuel成员访问engine的私有成员和保护的成员
class fuel;
class engine
{
friend class fuel;
private;
int powerlevel;
public;
engine(){powerLevel =0;}
void engine_fn(fuel&f);
};
class fuel
{
friend class engine;
private;
int fuelLevel;
public:
fuel(){fuelLevel=0;}
void fuel_fn(engine &e);
};