• 面向对象实验二友元


    一、实验目的

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

  • 相关阅读:
    【前端】css如何实现箭头>?
    HazelEngine 学习记录 - Camera Controllers
    CentOS安装Docker
    APISpace 汉语拆字API
    SpringBoot-整合MyBatis
    弘辽科技:淘宝店铺被管控还能开吗?原因是什么?
    Java面向对象之——多态
    克服大型语言模型幻觉使用检索增强生成(RAG)
    pyvista
    C# 面向对象
  • 原文地址:https://blog.csdn.net/night__wind/article/details/127914268