本例通过读取北、上、广的平均工资为背景进行友元函数的友元类的功能测试。
一、案例代码:
-
// 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;
-
}
图1、通过友元函数和友元类访问类的私有成员
将上面的屏蔽代码开放后,会出现下面的警告!证明非友元类或函数是不能访问一个类的私有成员的!!!
图2、非友元访问时受阻碍
二、注意友元函数与友元类的定义方法
(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的私有成员的。
这就是友元类的单向性的表现!
阅读(1399) | 评论(0) | 转发(0) |