`
美丽的小岛
  • 浏览: 297340 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

友元类

    博客分类:
  • c++
 
阅读更多

声明:

 在类中用 friend class 友元类名;

作用:

在友元类的所有成员函数都可以访问此类中的所有数据

 格式: 

  • class 友元类名 ;//向前声明本类
  • class 拥有友元类的类名{....};//拥有友元类的类的定义
  • class 友元类名 {…}//友元的定义

 特点: 

  • 友元关系不能被继承
  • 友元关系是单向的,不具有交换性.若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明.
  • 友元关系不具有传递性.若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

 

例子:

class B;   //友元类的向前声明
 class A    //拥有友元类的类的定义
 {
     int y;
 public:
     A()
     {
         y=4;
     }
     friend B;
 };
 
 class B  //友元类的定义
 {
 public:
     void show(A &a)
     {
         cout<<a.y<<endl;
     }
 };

 多个类包含一个友元类:

class C;  //友元类的向前声明
 class A   //拥有友元类的类的定义
 {
     int x;
 public:
     A()
     {
         x=4;
     }
     friend C;
 };
 
 class B   //拥有友元类的类的定义
 {
     int y;
 public:
     B()
     {
         y=6;
     }
     friend C;
 };
 
 class C    //友元类的定义
 {
 public:
     void show(A &a,B &b)
     {
         cout<<a.x<<"  "<<b.y<<endl; 
     }
 };
 
 void func()
 {
     A a;
     B b;
     C c;
     c.show(a,b);
 }

 一个类包含多个个友元类:

class B;    //友元类向前声明
 class C;    //友元类向前声明
 class A     //拥有友元类的定义
 {
     int x;
 public:
     A()
     {
         x=4;
     }
     friend C;
     friend B;
 };
 
 class B   //友元类的定义
 {
 public:
     void show(A &a)
     {
         cout<<"the value of a is: "<<a.x<<"        (in the class B)"<<endl; 
     }
 };
 class C   //友元类的定义
 {
 public:
     void show(A &a)
     {
         cout<<"the value of a is: "<<a.x<<"        (in the class C)"<<endl; 
     }
 };
 
 void func()
 {
     A a;
     B b;
     C c;
     b.show(a);
     c.show(a);
 }

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics