本例通过读取北、上、广的平均工资为背景进行友元函数的友元类的功能测试。
一、案例代码:
- // FriendSystem.cpp : 定义控制台应用程序的入口点。
- //
-
- #include "stdafx.h"
- #include iostream>
- #include string.h>
-
- void commonFunction();
- class CGuangDong;
- class CShangHai;
- class CBeiJing;
-
- class CGuangDong
- {
- private:
- int averageRevenue;
- friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
- void showRevenue()
- {
- printf("People of Guang dong's average revenue = %d\n",averageRevenue);
- }
-
- public :
- CGuangDong()
- {
- averageRevenue = 100000/5*6*9*7/8/6*3/9/5;
- }
- void AccessSH(CShangHai *sh);
- void AccessBJ(CBeiJing *bj);
- };
-
-
- class CShangHai
- {
- private:
- int averageRevenue;
- friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
- void showRevenue()
- {
- printf("People of shang hai's average revenue = %d\n",averageRevenue);
- }
- public :
- CShangHai()
- {
- averageRevenue = 100000/5*6*9*12/8/6*3/9/5;
- }
- friend class CGuangDong; /* 一个友元类 */
- };
-
-
- class CBeiJing
- {
- private:
- int averageRevenue;
- void showRevenue()
- {
- printf("People of Bei jing's average revenue = %d\n",averageRevenue);
- }
-
- public :
- CBeiJing()
- {
- averageRevenue = 100000/5*6*9*11/8/6*3/9/5;
- }
- friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
- };
-
- /* 友元函数的实现 */
- void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd)
- {
- printf("北京、上海、广东的平均收入分别是: %d,%d,%d\n",bj->averageRevenue,sh->averageRevenue,gd->averageRevenue);
- }
-
-
- void CGuangDong::AccessSH(CShangHai *sh)
- {
- printf("A friend class access CShangHai's averageRevenue = %d\n",sh->averageRevenue);
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // void CGuangDong::AccessBJ(CBeiJing *bj)
- // {
- // printf("class CGuangDong access CBeiJing's averageRevenue = %d\n",bj->averageRevenue);
- // }
-
- //void externalFunction2(CBeiJing *bj,CShangHai *sh,CGuangDong *gd)
- //{
- // printf("北京、上海、广东的平均收入分别是:",bj->averageRevenue,sh->averageRevenue,gd->averageRevenue);
- //}
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- CBeiJing *person1 = new CBeiJing();
- CShangHai *person2 = new CShangHai();
- CGuangDong *person3 = new CGuangDong();
-
- /* 友元函数访问一个类 */
- externalFunction1(person1,person2,person3);
-
- /* 访问友元类中的私有成员 */
- person3->AccessSH(person2);
-
- getchar();
- return 0;
- }
将上面的屏蔽代码开放后,会出现下面的警告!证明非友元类或函数是不能访问一个类的私有成员的!!!
图2、非友元访问时受阻碍
二、注意友元函数与友元类的定义方法
(1)、友元函数在类中的声明
(2)、友元函数在类外的定义
(3)、友元类的使用方法
这 样说明 CGuangDong是CShangHai的一个友元类,CGuangDong的对象是可以访问CShangHai 的私有成员的;
而相反 CShangHai的对象是不能访问 CGuangDong 的私有成员的。
这就是友元类的单向性的表现!
(1)、友元函数在类中的声明
- friend void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd);
(2)、友元函数在类外的定义
-
- /* 友元函数的实现 */
- void externalFunction1(CBeiJing *bj,CShangHai *sh,CGuangDong *gd)
- {
- printf("北京、上海、广东的平均收入分别是: %d,%d,%d\n",bj->averageRevenue,sh->averageRevenue,gd->averageRevenue);
- }
- /* 友元函数的实现 */
(3)、友元类的使用方法
- class CShangHai
- {
- friend class CGuangDong; /* 一个友元类 */
- }
这 样说明 CGuangDong是CShangHai的一个友元类,CGuangDong的对象是可以访问CShangHai 的私有成员的;
而相反 CShangHai的对象是不能访问 CGuangDong 的私有成员的。
这就是友元类的单向性的表现!