友元类和友元函数

来源:互联网 发布:大华网络摄像机 复位 编辑:程序博客网 时间:2024/06/01 07:41
友元类和友元函数

友元是一种共享数据的方式,也是一种破坏类的封装性获取类的隐藏数据的方式。

在一个类中声明友元的方式是,用关键字friend把普通函数、其他类的成员函数或其它类声明为此类的友元。声明为某类的友元,可以访问该类的私有和保护数据成员。如果友元是普通函数或是类的成员函数,此时的友元叫做友元函数,如果友元是类的话,就称之为友元类,友元类中的所有函数都是友元函数。下面从友元函数和友元类两方面开始讲解。

一、友元函数

友元函数是在类的声明中用关键字friend修饰的普通函数或者其他类的成员函数,不是该类的成员函数,不属于任何类。

友元函数必须在类的定义中加以声明且声明可以放在类的公有部分也可以放在类的私有部分,它们是没有区别的。友元函数可以在类外定义也可以在类内定义,友元函数在类内定义时,友元函数调用时必须具有该类类型的实参,否则就是非法调用。友元函数在类外定义的时候,不加关键字friend。

class Tan{friend void Show_r(Tan &a);   friend void show(); friend void showtime(Tan &b)//友元函数在类内定义的时候,必须有该类类型的形参{cout<<"欢迎来安徽黄山旅游"<<endl;};public:Tan(int i):r(i){};private:int r;};void Show_r(Tan &a){cout<<"love="<<a.r<<endl;}void show(){cout<<"欢迎来安徽旅游"<<endl;}void main(){Tan tan(78);Show_r(tan);show();showtime(tan);}
上面讲到的是普通函数作为类的友元,现在下面分析下其他类的成员函数作为类的友元。比如A类的成员函数fun是B类的友元函数,声明格式如下:
class 类;//class B

class 友元函数为其成员函数的类的类名{};//class A{};

class 类名{};//class B{};
  class Date;                               //对 Date 类的向前声明,必须提前声明  class Time                                //定义 Time 类,此类的成员函数是Date类的友元函数  {  public:      Time(int,int,int);      void display(Date&);                 //display 是 Time 类的成员函数,形参是 Date 类对象的引用  private:      int hour;      int minute;      int sec;  };  class Date  {  public:      Date(int,int,int);      friend void Time::display(Date&);               //声明 Time 类的 display函数为本类的友元函数  private:      int month;      int day;      int year;  };  Time::Time(int h,int m,int s)                        //定义 Time 类的构造函数  {      hour = h;      minute = m;      sec = s;  }  void Time::display(Date&d)                 //display 函数的作用是输出年、月、日和时、分、秒  {      cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;       //引用 Date 类对象中的私有数据      cout<<hour<<":"<<minute<<":"<<sec<<endl;             //引用本类对象中的私有数据  }  Date::Date(int m,int d,int y)                        //定义 Date 类的构造函数  {      month = m;      day = d;      year = y;  }  void main()  {Time t1(11,10,0);Date date(7,17,2015);t1.display(date);  }

上面程序我们需要先在类中声明成员函数,然后在声明为某类的友元函数

二、友元类

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息。友元类的声明放在类的私有部分和公有部分都是一样的。
     class Radius//此时不需要对Circle提前声明,下面直接声明为 friend class Circle ,此时相当于对Circle声明{friend class Circle;                 //声明Circle为Radius的友元类friend void Show_r(Radius &n);     //声明Show_r为友元函数public:Radius(int x){r = x;}~Radius(){}private:int r;};void Show_r(Radius &n){cout<<"圆的半径为: "<<n.r<<endl;    //调用Radius对象的私有成员变量r}class Circle{public:Circle()    {}~Circle(){}double area(Radius a){s = a.r * a.r * 3.1415926;             //调用Radius对象的私有成员变量rreturn s;}private:double s;};int main(){Radius objRadius(9);Circle objCircle;Show_r( objRadius );cout<<"面积为:"<<objCircle.area(objRadius)<<endl;return 0;}

class B;   //友元类的向前声明 class A    //拥有友元类的类的定义 {     int y; public:     A()     {         y = 4;     }  friend  B;//此时需要对B声明,所以前面对class B声明了。 };  class B  //友元类的定义 { public:     void show(A &a)     {         cout<<a.y<<endl;     } }; void main() {A a;B b;b.show(a); }
友元关系不能被继承,友元关系是单向的,友元关系不具有传递性。


0 0
原创粉丝点击