一、实验目的
一个类的友元函数能够直接访问该类所有成员,包括 public、protected、private 类
型的成员;一个类可以是另一个类的友元,友元类的所有成员函数都是另一个类的友元函数,
能够直接访问另一个类的所有成员。本实验目的是:熟练掌握友元函数的设计与应用;熟练
掌握友元类的设计与应用。
二、实验内容
使用 Visual C++ 6.0 分别建立学生类 CStudent、学生类的友元函数以及学生类的友元类,
并编制主程序来验证对所创建的友元函数和友元类的正确性。
三、实验要求
1.设计一个学生类 CStudents,其结构如下:
l 私有数据成员 ID(学号)、Name(学生姓名)、Score(成绩);
l 构造函数对数据成员初始化;
l 设计一个友元函数 Display(CStudent&);根据百分制成绩输出成绩的等级:>=90
为优秀;80~89 为良好;70~79 为中等;60~69 为及格;< 60 为不及格;
l 输出结果如下:
姓名 成绩 等级
LeBron Jams 75 中等
Michael Jordan 98 优秀
Chris Bosh 55 不及格
Stephen Curry 80 良好
l 2.设计一个 CStudents 的友元类 CTeacher,其结构包含两个成员函数:
n void Modify(CStudent& s):实现对学生的成绩的修改;
n void Display(CStudent& s)输出 s 成绩的等级;
四、思考题
1.友元函数有什么特点?在什么时候采用友元函数?
2.友元类有什么特点?什么是使用友元类的限制?
实验代码:
//CStudents.h
#ifndef CSTUDENTS_H_
#define CSTUDENTS_H_
#include
#include
using namespace std;
class CStudents
{
friend class CTeacher;
private:
int ID;//学号
string Name;//姓名
int Score;//成绩
public:
CStudents(int i=0,char *n="null",int S=0);//构造函数初始化
friend void Display(CStudents &s);
};
class CTeacher
{
public:
CTeacher(){ CStudents(); }
void Modify(CStudents &s);//实现对学生成绩的修改
void Display(CStudents &s);//输出s成绩的等级
};
#endif
//CStudents.cpp
#include
#include"CStudents.h"
using namespace std;
CStudents::CStudents(int i, char *n, int S) :ID(i), Name(n), Score(S)
{
}
void Display(CStudents &s)
{
cout.width(15);
cout << s.Name;
cout.width(8);
cout< if (s.Score >= 90) { cout.width(10); cout << "优秀" << endl; } else if (s.Score >= 80 && s.Score <= 89) { cout.width(10); cout << "良好" << endl; } else if (s.Score >= 70 && s.Score <= 79) { cout.width(10); cout << "中等" << endl; } else if (s.Score >= 60 && s.Score <= 69) { cout.width(10); cout << "及格" << endl; } else { cout.width(10); cout << "不及格" << endl; } } void CTeacher::Modify(CStudents &s) { string g; cout << "please enter what data you want to change (取消 to quit):(成绩、学号、姓名) "; while (1) { cin >> g; if (g == "取消") { break; } else if(g == "成绩") { cout << "How many you want to change: "; int cheng; cin >> cheng; s.Score = cheng; } else if(g == "学号") { cout << "What ID you want to change:"; int ji; cin >> ji; s.ID = ji; } else if (g == "姓名") { cout << "What name you want to change:"; string name; cin >> name; s.Name = name; } else cout << "you enter is wrong!"; cout << "please enter what data you want to change (取消 to quit):(成绩、学号、姓名) "; } } void CTeacher::Display(CStudents &s) { if (s.Score >= 90) { cout.width(10); cout << "优秀" << endl; } else if (s.Score >= 80 && s.Score <= 89) { cout.width(10); cout << "良好" << endl; } else if (s.Score >= 70 && s.Score <= 79) { cout.width(10); cout << "中等" << endl; } else if (s.Score >= 60 && s.Score <= 69) { cout.width(10); cout << "及格" << endl; } else { cout.width(10); cout << "不及格" << endl; } } //user.cpp #include"CStudents.h" //#include //using namespace std; int main() { CStudents a2(1400830222,"LeBron Jams",75); CStudents a1; CStudents a3(1400830221, "Michael Jordan", 98); CStudents a4(1400830220, "Chris Bosh", 55); CStudents a5(1400830219, "Stephen Currt", 80); cout << " 姓名 成绩 等级 " << endl; cout << "-----------------------------------" << endl; Display(a1); Display(a2); Display(a3); Display(a4); Display(a5); CTeacher b1; cout << " "<< endl; cout << " " << endl; cout << "测试CTeacher 的Display." << endl; b1.Display(a4); cout << " " << endl; cout << " " << endl; b1.Modify(a2); Display(a2); return 0; } 思考题1:友元函数有什么特点?在什么时候采用友元函数? 答:友元函数不属于类的内部函数,但却可以访问类的私有成员。在想实现数据之间的共享和减少资源开销时可以使用和在类A要访问类B的私有成员时可以采用。 思考题2:友元类有什么特点?什么是使用友元类的限制? 答:一个类的友元类可以访问这个类的所有成员,这个友元类的函数全都为该类的友元函数。友元类的限制:友元类不能被继承;友元类是单向的,比如A是B的友元但B并不是A的友元;友元关系不能传递,比如B是A的友元,C是B的友元,并不意味着C是A的友元。