Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12838714
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类: C/C++

2013-03-26 19:53:21

    本例通过读取北、上、广的平均工资为背景进行友元函数的友元类的功能测试。


 一、案例代码:


  1. // FriendSystem.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <string.h>

  6. void commonFunction();
  7. class CGuangDong;
  8. class CShangHai;
  9. class CBeiJing;

  10. class CGuangDong
  11. {
  12. private:
  13.     int averageRevenue;
  14.     friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
  15.     void showRevenue()
  16.     {
  17.         printf("People of Guang dong's average revenue = %d\n",averageRevenue);
  18.     }

  19. public :
  20.      CGuangDong()
  21.      {
  22.             averageRevenue = 100000/5*6*9*7/8/6*3/9/5;    
  23.      }
  24.      void AccessSH(CShangHai *sh);
  25.      void AccessBJ(CBeiJing *bj);
  26. };


  27. class CShangHai
  28. {
  29. private:
  30.     int averageRevenue;
  31.     friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
  32.     void showRevenue()
  33.     {
  34.         printf("People of shang hai's average revenue = %d\n",averageRevenue);
  35.     }
  36. public :
  37.      CShangHai()
  38.      {
  39.             averageRevenue = 100000/5*6*9*12/8/6*3/9/5;    
  40.      }
  41.      friend class CGuangDong;         /*    一个友元类    */
  42. };


  43. class CBeiJing
  44. {
  45. private:
  46.     int averageRevenue;
  47.     void showRevenue()
  48.     {
  49.         printf("People of Bei jing's average revenue = %d\n",averageRevenue);
  50.     }

  51. public :
  52.      CBeiJing()
  53.      {
  54.             averageRevenue = 100000/5*6*9*11/8/6*3/9/5;    
  55.      }
  56.      friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
  57. };

  58. /* 友元函数的实现 */
  59. void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd)
  60. {
  61.     printf("北京、上海、广东的平均收入分别是: %d,%d,%d\n",bj->averageRevenue,sh->averageRevenue,gd->averageRevenue);
  62. }


  63. void CGuangDong::AccessSH(CShangHai *sh)
  64.      {
  65.          printf("A friend class access CShangHai's averageRevenue = %d\n",sh->averageRevenue);
  66.      }
  67.      
  68.     
  69.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  70.     // void CGuangDong::AccessBJ(CBeiJing *bj)
  71.     // {
  72.     //     printf("class CGuangDong access CBeiJing's averageRevenue = %d\n",bj->averageRevenue);
  73.     // }

  74.     //void externalFunction2(CBeiJing *bj,CShangHai *sh,CGuangDong *gd)
  75.     //{
  76.     //     printf("北京、上海、广东的平均收入分别是:",bj->averageRevenue,sh->averageRevenue,gd->averageRevenue);
  77.     //}
  78.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

  79. int _tmain(int argc, _TCHAR* argv[])
  80. {
  81.     CBeiJing *person1 = new CBeiJing();
  82.     CShangHai *person2 = new CShangHai();
  83.     CGuangDong *person3 = new CGuangDong();

  84.     /*        友元函数访问一个类    */
  85.     externalFunction1(person1,person2,person3);
  86.     
  87.     /* 访问友元类中的私有成员 */
  88.     person3->AccessSH(person2);

  89.     getchar();
  90.     return 0;
  91. }


image 图1、通过友元函数和友元类访问类的私有成员



    将上面的屏蔽代码开放后,会出现下面的警告!证明非友元类或函数是不能访问一个类的私有成员的!!!
 


image

图2、非友元访问时受阻碍

二、注意友元函数与友元类的定义方法

(1)、友元函数在类中的声明

  1. friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);


(2)、友元函数在类外的定义

    1. /* 友元函数的实现 */
    2. void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd)
    3. {
    4.     printf("北京、上海、广东的平均收入分别是: %d,%d,%d\n",bj->averageRevenue,sh->averageRevenue,gd->averageRevenue);
    5. }

(3)、友元类的使用方法

  1. class CShangHai
  2. {
  3. friend class CGuangDong; /* 一个友元类 */
  4. }

    这样说明
CGuangDong是CShangHai的一个友元类,CGuangDong的对象是可以访问CShangHai的私有成员的;
    而相反CShangHai的对象是不能访问CGuangDong的私有成员的。

    这就是友元类的单向性的表现!



阅读(3401) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~