Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160454
  • 博文数量: 83
  • 博客积分: 3956
  • 博客等级: 中校
  • 技术积分: 663
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-24 16:29
文章分类

全部博文(83)

文章存档

2010年(83)

我的朋友

分类: C/C++

2010-10-25 11:19:35

1、友元函数

类中私有和保护的成员在类外不能被访问。

友元函数是一种定义在类外部的普通函数,其特点是能够访问类中私有成员和保护成员,即类的访问权限的限制对其不起作用。

友元函数需要在类体内进行说明,在前面加上关键字friend。

一般格式为:

friend  FuncName();

友元函数不是成员函数,用法也与普通的函数完全一致,只不过它能访问类中所有的数据。友元函数破坏了类的封装性和隐蔽性,使得非成员函数可以访问类的私有成员。

一个类的友元可以自由地用该类中的所有成员。

class A{
    float x,y;
public:
A(float a, float b){ x=a; y=b;}
float Sum(){ return x+y; }
friend float Sum(A &a);
};

float Sum(A &a)
{ return a.x+a.y;    }
void main(void)
{ A t1(4,5),t2(10,20);
    cout<<t1.Sum()<<endl;
   cout<<Sum(t2)<<endl;
}

有关友元函数的使用,说明如下:

友元函数不是类的成员函数

友元函数近似于普通的函数,它不带有this指针,因此必须将对象名或对象的引用作为友元函数的参数,这样才能访问到对象的成员。

友元函数与一般函数的不同点在于:

  1. 友元函数必须在类的定义中说明,其函数体可在类内定义,也可在类外定义;

  2. 它可以访问该类中的所有成员(公有的、私有的和保护的),而一般函数只能访问类中的公有成员。

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 &);
};
float Sumxy(A &a){ return a.Getx()+a.Gety(); }
//float Sumxy(A &a){return a.x+a.y; }

float Sum(A &a){ return a.x+a.y; }
void main(void)
{ A t1(1,2),t2(10,20), t3(100,200);
    cout<<t1.Sum()<<endl;
   cout<<Sum(t2)<<endl;
   cout<<Sumxy(t3)<<endl;
}

友元函数不受类中访问权限关键字的限制,可以把它放在类的私有部分,放在类的公有部分或放在类的保护部分,其作用都是一样的。换言之,在类中对友元函数指定访问权限是不起作用的。

友元函数的作用域与一般函数的作用域相同。

谨慎使用友元函数

通常使用友元函数来取对象中的数据成员值,而不修改对象中的成员值,则肯定是安全的。

大多数情况是友元函数是某个类的成员函数,即A类中的某个成员函数是B类中的友元函数,这个成员函数可以直接访问B类中的私有数据。这就实现了类与类之间的沟通。

注意:一个类的成员函数作为另一个类的友元函数时,应先定义友元函数所在的类。

class B ;    //先定义类A,则首先对类B作引用性说明

class A{
   ......        //类A的成员定义

   public:
   void fun( B & );//函数的原型说明

    };
class B{    ......
    friend void A::fun( B & );//定义友元函数

}
    void A::fun ( B &b)     //函数的完整定义

{
     ......        //函数体的定义


class B;        //必须在此进行引用性说明,
class A{
    float x,y;
public:
  A(float a, float b){ x=a; y=b;}
  float Sum(B &); //说明友元函数的函数原型,是类A的一成员函数

};
class B{
    float m,n;
public:
   B(float a,float b){ m=a;n=b; }
   friend float A::Sum(B &);//说明类A的成员函数是类B的友元函数

}
float A::Sum( B &b)        //定义该友元函数

{ x=b.m+b.n; y=b.m-b.n; }
void main(void)
{ A a1(3,5);
     B b1(10,20);
     a1.Sum(b1);    //调用该函数,因是类A的成员函数,故用类A的对象调用

}

阅读(366) | 评论(0) | 转发(0) |
0

上一篇:继承和派生类

下一篇:类的重要特征(二)

给主人留下些什么吧!~~