友元函数与友元类测试案例

简介:     本例通过读取北、上、广的平均工资为背景进行友元函数的友元类的功能测试。  一、案例代码: // FriendSystem.cpp : 定义控制台应用程序的入口点。

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


 一、案例代码:


  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 的私有成员的。

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



相关文章
|
11月前
|
人工智能 供应链 安全
AI辅助安全测试案例某电商-供应链平台平台安全漏洞
【11月更文挑战第13天】该案例介绍了一家电商供应链平台如何利用AI技术进行全面的安全测试,包括网络、应用和数据安全层面,发现了多个潜在漏洞,并采取了有效的修复措施,提升了平台的整体安全性。
464 4
|
12月前
|
测试技术 开发者
vertx的学习总结6之动态代理类和测试
本文是Vert.x学习系列的第六部分,介绍了如何使用动态代理在事件总线上公开服务,以及如何进行Vert.x组件的异步测试,包括动态代理的创建和使用,以及JUnit 5和Vert.x测试工具的结合使用。
103 3
vertx的学习总结6之动态代理类和测试
|
12月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
199 5
|
前端开发 机器人 测试技术
【RF案例】Web自动化测试弹窗处理
在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
272 6
【RF案例】Web自动化测试弹窗处理
|
12月前
|
分布式计算 大数据 Spark
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例(二)
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例(二)
127 1
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
169 2
|
12月前
|
存储 SQL 分布式计算
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例(一)
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例(一)
139 0
|
JSON 测试技术 数据格式
单元测试问题之使用JCode5插件生成测试类如何解决
单元测试问题之使用JCode5插件生成测试类如何解决
411 3
|
Java 测试技术 Spring
单元测试问题之在 JCode5 类中使用 testService如何解决
单元测试问题之在 JCode5 类中使用 testService如何解决
93 2
|
测试技术
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
137 3

热门文章

最新文章