出于信息隐藏的目的,类的数据成员一般定义为私有成员,并通过公有函数对外提供访问接口。但有时需要定义一些函数,这些函数不是类的一部分,但又需要访问类的数据成员,这样可将这些函数定义为该类的友元函数。除了友元函数外,还有友元类,它们被统称为友元。友元的作用是提高程序的执行效率,但也牺牲了类的封装性。
#include"string.h"
#include<iostream>
#include<iomanip>
using namespace std;
class Stu
{
char name[10];
int deg;
char level[10];
public:
Stu(char na[],int d)
{
strcpy(name,na);
deg=d;
}
char *getname()
{
return name;
}
//friend 函数类型 友元函数名(参数表)
//友元函数trans(),友元函数是拥有成员函数一切权利的非成员函数,
//也就是说,友元函数不是类的成员函数,但是它可以像成员函数一样直接访问类的私有成员(包括私有数据成员和成员函数)。
//为了使一个函数成为类的友元函数,必须在类的声明中指明。声明友元函数的方式是在类中用关键词friend声明该函数
//要想通过某个友元函数访问一个类,必须要把该友元函数声明在该类中。可以在类的任意位置,意义完全一样,除了类之外。
//但是它的定义既可以放在类的外部也可以是内部。一般与类的成员函数定义在一起。
friend void trans(Stu &s)
{
if(s.deg>=90)
strcpy(s.level,"优");
else if(s.deg>=80)
strcpy(s.level,"良");
else if(s.deg>=70)
strcpy(s.level,"中");
else if(s.deg>=60)
strcpy(s.level,"及格");
else
strcpy(s.level,"不及格");
}
void disp()
{
cout<<" "<<name<<","<<deg<<","<<level<<endl;
}
};
void main()
{
Stu st[]={Stu("王虎",76),Stu("林燕风",54),Stu("张鹏",97),Stu("孙涛",84),Stu("马灵",69),Stu("长城",68)};
cout<<"成绩结果:"<<endl;
for(int i=0;i<6;i++)
{
trans(st[i]);
st[i].disp();
}
}