面向对象实验二友元

一、实验目的

一个类的友元函数能够直接访问该类所有成员,包括 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<iostream>

#include<string>

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<iostream>

#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<<s.Score;

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<iostream>

//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的友元。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Polices张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值