Student类(友元,运算符重载,继承)综合题
//定义Student类,Date类,类定义与成员函数,实现分离。
//将Student类声明为Date的友元类。Student类需要提前声明。
//Student类的成员函数可以访问Date类的私有成员。
//成员函数:构造函数,构造函数重载,析构函数,
//输出函数,求成绩最低者函数,排序函数。
//使用new,delete,动态分配内存。实现班级人数不固定,可以从键盘输入。
//定义Doctor类(研究生)-公共继承于Student类
//增加私有成员:string thesis(论文评价),int sci_value(科研分值)
//增加相应的成员函数
//增加友元函数-运算符重载<<,>>
//增加成员函数--按照科研分值高低排序
//student.h---头函数,类的定义
#include
#include
using namespace std;
class Student; //提前声明
class Date //定义Date类-存放出生年月日
{
friend class Student; //友元类,Student成员函数可以访问Date类的私有成员public:
Date(); //无参构造函数
Date(int,int,int); //有参构造函数
~Date(); //析构函数
//protected: //这里是保护成员//这里是VC6.0的原因
int year; //年
int month; //月
int day; //日
};
class Student //定义Student类-存放学生信息
{
public:
Student(); //无参构造函数
Student(string ,string ,char,Date,int); //有参构造函数
~Student(); //析构函数
void display(); //输出函数
void input(); //输入函数
void min(Student*,int); //求最低成绩函数
void sort(Student*,int); //按照成绩高低排序函数
//protected: //这里是保护成员//这里是VC6.0的原因string num; //学号
string name; //姓名
char sex; //性别
Date birthday; //生日
int score; //成绩
};
//以下内容是增加继承后增添的
class Doctor:public Student //定义Doctor类,是Student的派生类
{
public:
Doctor(); //无参构造函数
Doctor(string,int ); //有参构造函数
void display1(); //输出函数
void set(); //输入函数
void sort(Doctor*,int); //按照科研分值高低排序函数
friend ostream& operator<<(ostream&,Doctor&);//重载运算符<<,友元函数friend istream& operator>>(istream&,Doctor&);//重载运算符>>,友元函数//private: //这里是VC6.0的原因
string thesis; //论文评价
int sci_value; //科研分值
};
//以上内容是增加继承后增添的
//student.cpp---成员函数的定义
#include"student.h"
Date::Date() //无参构造函数
{
year=1900; //默认生日:1900-1-1
month=1;
day=1;
}
Date::Date(int y,int m,int d) //有参构造函数
{
year=y;
month=m;
day=d;
}
Date::~Date() //析构函数-函数体为空
{
//cout<<"Date Destructor called."< } Student::Student() //无参构造函数,自动赋值 { num=""; //默认为空字符串 name=""; //默认为空字符串 sex=' '; //默认为空格 birthday.year=1900; //默认生日:1900-1-1 birthday.month=1; birthday.day=1; score=0; //默认成绩为0 } Student::Student(string n,string nam,char s,Date bir,int c) //有参构造函数,将参数值赋给成员{ num=n; name=nam; sex=s; birthday.year=bir.year; birthday.month=bir.month; birthday.day=bir.day; score=c; } Student::~Student() //析构函数-函数体为空 { // cout<<"Destructor called."< } void Student::display() //输出学生信息函数 { cout<<"num:"< cout<<"name:"< cout<<"sex:"< cout<<"birthday:"< cout<<"score:"< } void Student::input() //输入学生信息函数 { cout<<"请输入学生信息:"< cout<<"学号姓名性别出生年出生月出生日成绩:"< cin>>num; cin>>name; cin>>sex; cin>>birthday.year; cin>>birthday.month; cin>>birthday.day; cin>>score; } void Student::sort(Student *p,int N) //按照成绩高低排序函数{ int i,j; string temp_num,temp_name; char temp_sex; Date temp_bir; int temp_score; for(i=0;i for(j=i+1;j if(p[i].score { temp_num=p[i].num; p[i].num=p[j].num; p[j].num=temp_num; temp_name=p[i].name; p[i].name=p[j].name; p[j].name=temp_name; temp_sex=p[i].sex; p[i].sex=p[j].sex; p[j].sex=temp_sex; temp_bir.year=p[i].birthday.year; p[i].birthday.year=p[j].birthday.year; p[j].birthday.year=temp_bir.year; temp_bir.month=p[i].birthday.month; p[i].birthday.month=p[j].birthday.month; p[j].birthday.month=temp_bir.month; temp_bir.day=p[i].birthday.day; p[i].birthday.day=p[j].birthday.day; p[j].birthday.day=temp_bir.day; temp_score=p[i].score; p[i].score=p[j].score; p[j].score=temp_score; } } void Student::min(Student *p,int N) //求最低成绩函数 { string min_num,min_name; char min_sex; Date min_bir; int min_score; min_num=p->num; min_name=p->name; min_sex=p->sex; min_bir.year=p->birthday.year; min_bir.month=p->birthday.month; min_bir.day=p->birthday.day; min_score=p->score; p++; for(int i=1;i { if(p->score { min_num=p->num; min_name=p->name; min_sex=p->sex; min_bir.year=p->birthday.year; min_bir.month=p->birthday.month; min_bir.day=p->birthday.day; min_score=p->score; } p++; } cout<<"学生成绩最低者信息:"< cout<<"num="< cout<<"name="< cout<<"sex="< cout<<"birthday:"< cout<<"score="< } //以下内容是增加继承后增添的 Doctor::Doctor() { thesis=""; sci_value=0; Doctor::Doctor(string t,int c) { thesis=t; sci_value=c; } void Doctor::display1() { cout<<"thesis:"< cout<<"sci_value:"< } void Doctor::set() { cout<<"学生论文等级和科研量化分数:"< cin>>thesis; cin>>sci_value; } void Doctor::sort(Doctor *p,int N) //按照科研分值高低排序函数{ int i,j; string temp_num,temp_name; char temp_sex; Date temp_bir; int temp_score; string temp_thesis; int temp_sci_value; for(i=0;i for(j=i+1;j if(p[i].sci_value { temp_num=p[i].num; p[i].num=p[j].num; p[j].num=temp_num; temp_name=p[i].name; p[i].name=p[j].name; p[j].name=temp_name; temp_sex=p[i].sex; p[i].sex=p[j].sex; p[j].sex=temp_sex; temp_bir.year=p[i].birthday.year; p[i].birthday.year=p[j].birthday.year; p[j].birthday.year=temp_bir.year; temp_bir.month=p[i].birthday.month; p[i].birthday.month=p[j].birthday.month; p[j].birthday.month=temp_bir.month; temp_bir.day=p[i].birthday.day; p[i].birthday.day=p[j].birthday.day; p[j].birthday.day=temp_bir.day; temp_score=p[i].score; p[i].score=p[j].score; p[j].score=temp_score; temp_thesis=p[i].thesis; p[i].thesis=p[j].thesis; p[j].thesis=temp_thesis; temp_sci_value=p[i].sci_value; p[i].sci_value=p[j].sci_value; p[j].sci_value=temp_sci_value; } } ostream& operator<<(ostream& output,Doctor& Doc)//重载运算符<< { output<<"num:"< output<<"name:"< output<<"sex:"< output<<"birthday:"< output<<"score:"< output<<"thesis:"< output<<"sci_value:"< return output; } istream& operator>>(istream& input,Doctor& Doc) //重载运算符>>,友元 { cout<<"学号姓名性别出生年月日成绩论文评价科研分值"< input>>Doc.num>>https://www.360docs.net/doc/0911186145.html,>>Doc.sex; input>>Doc.birthday.year>>Doc.birthday.month>>Doc.birthday.day; input>>Doc.score; input>>Doc.thesis>>Doc.sci_value; return input; } //以上内容是增加继承后增添的 //main.cpp---主函数,发布消息 #include"student.h" int main() { /* Student s1; Date bir(1998,2,27); Student s2("1003","zhang",'f',bir,99); s1.display(); s2.display(); int stu_total; //学生总数 cout<<"输入班级学生总人数:"; cin>>stu_total; Student *p=new Student[stu_total]; //动态分配内存,p指向它 for(int i=0;i { (p+i)->input(); //通过成员函数Student::input()向这片内存地址写入学生信息} cout<<"排序之前学生信息如下:"< for(i=0;i (p+i)->display(); //通过Student::display()将这片内存所存放的学生信息输出 Student *ps; //定义一个指向Student的指针对象(变量) ps=p; //让ps指向p ps->min(ps,stu_total); //输出成绩最低者 ps->sort(ps,stu_total); //排序 ps=p; //让重新指向p cout<<"排序之后学生信息如下:"< for(i=0;i { ps->display();//通过Student::display()将这片内存所存放的学生信息输出 ps++; } //以下内容是增加继承后增添的 Doctor d1("excellent",95); //调用有参构造函数 d1.input(); //输入学生信息 cout<<"研究生信息"< d1.display(); //输出学生信息 d1.display1(); //输出研究生信息 Doctor d2; //调用无参构造函数 d2.input(); //输入学生信息 d2.set(); //输入研究生信息 cout<<"研究生信息"< d2.display(); //输出学生信息 d2.display1(); //输出研究生信息 cout<<"重载运算符后:"< cout< //以上内容是增加继承后增添的 */ //下面这一部分,最新 int doc_total; //博士生总数 cout<<"输入博士生总人数:"; cin>>doc_total; Doctor *p=new Doctor[doc_total]; //动态分配内存,p指向它 cout<<"输入博士信息"< for(int i=0;i cin>>p[i]; cout<<"排序之前博士生信息如下:"< for(i=0;i cout< Doctor *ps; //定义一个指向Doctor的指针对象(变量)ps=p; //让ps指向p ps->sort(ps,doc_total); //排序 ps=p; //让重新指向p cout<<"排序之后博士生信息如下:"< for(i=0;i cout< //上面这一部分,最新 delete [] p; //释放p指向的内存空间 return 0; } 1.定义一个哺乳动物类Mammal,并从中派生出一个狗类Dog,下面给出Mammal类的定义,要求: (1)添加Dog类的颜色数据成员,访问属性为私有,通过SetColor和GetColor成员函数来对颜色进行设置和获取。 (2)分别为基类和派生类添加相应的构造函数(有参、无参)和析构函数,并进行测试。 class Mammal { protected: int itsAge; int itsWeight; public: int GetAge(){return itsAge;} void SetAge(int age) {itsAge=age;} int GetWeight() { return itsWeight;} void SetWeight(int weight) {itsWeight= weight;} }; class Dog : public Mammal { //定义Dog类的数据成员和成员函数 }; 改: #include 实验目的与要求: 1.掌握类的继承与派生关系以及实验方法,理解类的层次结构。 2.掌握派生类构造函数初始化基类成员和对象成员的方法。 3.掌握内联函数和默认函数。 4.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。 实验过程及内容: 1.实践教程实验二十二P81范例:定义一个继承与派生关系的类体系,在 派生类中访问基类成员。 ①先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员; ②以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数; ③定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,不能用派生。 编程测试所定义的类体系。 本实验教程中有源码,请自行运行,体会和熟悉继承与派生的基本概念及实现方法,掌握派生类构造函数初始化基类成员和对象成员的方法等。2. 实践教程P83编程:多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。要求计算圆柱的底面积、侧面积、全面积和体积。 请编写所有完整的成员函数,并编写主函数进行验证。 数据处理 1. (1) (2)j结果报错,原因是派生类中的成员函数不能访问基类中的私有成员。(3)在Line类中添加两个数据成员。 2. #include 实验二类的继承与派生 班级:网络工程1班 姓名:倪冬生 学号:20112346017 一、实验目的 1. 掌握类的声明和使用。 2. 掌握类的声明和对象的声明。 3. 复习具有不同访问属性的成员的访问方式。 4. 观察构造函数和析构函数的执行过程。 5. 学习声明和使用类的继承关系,声明派生类; 6. 熟悉不同继承方式下对基类成员的访问控制; 二.实验内容 1. 设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、 id(身份证号)等等。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号charid[16]。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、组合。在测试程序中声明people 类的对象数组,录入数据并显示。 2. 从people(人员)类派生出student(学生)类,添加属性:班号char classNO[7];从people 类派生出teacher(教师)类,添加属性:职务char pship[11]、部门char departt[21]。从student 类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate 类和teacher 类派生出TA(助教博士生)类,重载相应的成员函数,测试这些类。 三 . 实验步骤 1.程序代码 #include 福建农林大学金山学院实验报告 系(教研室):信息与机电工程系专业:计算机科学与技术年级: 实验课程:面向对象程序设计姓名:学号: 实验室号 计算机号 实验时间:指导教师签字:成绩: 实验4 派生类和继承(一) 一、实验目的和要求 (1)掌握派生类的声明与定义方法,进一步理解类的继承的概念,能够定义和使用类的继承关系。 (2)熟悉公有派生和私有派生的访问特性。 二、实验内容和原理 1、程序分析题(写出程序的输出结果,并分析结果)。 2、(1)定义一个基类animal,该类具有私有整型成员变量age,weight,构造派生类dog公有继承animal,dog类新增私有成员变量color,新增成员函数SetAge(int n)中直接给age赋值,新增成员函数SetWeight(int m)中直接给weight赋值,查看编译结果,并分析结果。(2)将类animal中的age和weight为公有成员,重做第一步,并分析结果。(3)将类animal中的age和weight为保护成员,重做第一步,并分析结果。(4)将派生类dog的继承方式改为私有继承方式和保护继承方式重做以上各小题,并分析结果。 三、实验环境 1. 硬件:PC机; 2. 软件:Windows操作系统、Visual C++ 6.0 四、算法描述及实验步骤 2.1 #include {private:char color[10]; public: int SetAge(int n) {age=n;return n;} int SetWeight (int m) {weight=m;return m; } }; int main() { int x,y; dog a; cout<<"请输入这条狗的岁数="; cin>>x;cout< 实验五运算符重载 【实验目的】 1.进一步了解运算符重载的概念和使用方法。 2.掌握几种常用的运算符重载的方法。 3.了解转换构造函数的使用方法。 4.了解在Visual C++6.0环境下进行运算符重载要注意的问题. 【实验要求】 1.硬件基本配置:Intel PentiumIII以上级别的CPU,大于64MB的内存。 2.软件要求:Window 2000操作系统,Visual Studio 6.0或更高版本开发环境。 3.实验学时:2学时 4.实现实验内容中的题目。 5.写实验报告 【实验内容】 (1)声明一个复数类Complex,重载运算符“+’’,“一”,“*”,“/”使之能用于复数的加、减、乘、除.运算符重载函数作为Complex类的成员函数,重载流提取运算符实现对复数的输出。编程序,分别求两个复数之和、差、积和商并用重载后的流运算符进行输出。 请思考:你编的程序能否用于一个整数与一个复数的算术运算?如4+ (5-2i). (2)声明一个复数类Complex,重载运算符“+“,使之能用于复数的加法运算。 参加运算的两个运算量可以都是类对象.也可以其中有一个是整数,顺序任意。例如, cl+c2, i+cl,cl+i均合法(设i为整数,c1, c2为复数)。 运行程序.分别求两个复数之和、整数和复数之和。 (3)有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于矩阵相加。如c=a+b。重载流提取运算符实现对矩阵的输出如:cout< 继承与多态习题 一.基本概念与基础知识自测题 8.1填空题 8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。(3)类 的对象可作为(4)类的对象处理,反过来不行,因为(5)。如果强制转换则要注意(6)。 答案:(1)基类 (2)派生类 (3)派生类 (4)基类 (5)派生类有一些新成员 (6)只能派生类强制转换为基类 8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员, protected成员成为派生类的(2)成员,对private成员是(3)。公有派生可以使其类的(4),所以公有派生是主流。 答案:(1)public成员 (2)protected成员 (3)不可访问 (4)接口不变 8.1.3 利用继承能够实现(1)。这种实现缩短了程序开发的时间,VC++中的(2)很 好地体现了这一点。 答案:(1)代码的复用 (2)MFC编程 8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.5 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和 (3)完全一样就认为是虚函数,而不必再加关键字(4)。如有任何不同,则认为是(5)而不是虚函数。除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。 答案:(1)同虚函数名 (2)同参数表 (3)同返回类型。如基类中返回基类指针,而派生类中返回派生类指针是允许的 (4)virtual (5)重载 (6)静态成员函数 (7)内联函数 (8)构造函数 8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质 是将指向函数体的指针定为(3)。 答案:(1)=0 (2)不定义 (3)NULL 8.2简答题 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)? 答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖(override)。 8.2.3派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的 调用?为什么? 答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。 8.2.4为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的 存储方式。 答:在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。虚基类(virtual base class)定义方式如下: class派生类名:virtual 访问限定符基类类名{...}; class派生类名:访问限定符virtual基类类名{...}; virtual 关键字只对紧随其后的基类名起作用。 //定义Student类,Date类,类定义与成员函数,实现分离。 //将Student类声明为Date的友元类。Student类需要提前声明。 //Student类的成员函数可以访问Date类的私有成员。 //成员函数:构造函数,构造函数重载,析构函数, //输出函数,求成绩最低者函数,排序函数。 //使用new,delete,动态分配内存。实现班级人数不固定,可以从键盘输入。 //定义Doctor类(研究生)-公共继承于Student类 //增加私有成员:string thesis(论文评价),int sci_value(科研分值) //增加相应的成员函数 //增加友元函数-运算符重载<<,>> //增加成员函数--按照科研分值高低排序 //student.h---头函数,类的定义 #include 实验十运算符重载1.实验目的及要求 1)掌握运算符重载的基本概念和方法。 2)熟习几种特殊的运算符的重载。 2.实验内容 1.分析下面的程序,指出程序运行的结果: 1) #include 运行结果为: 30,30 Press any key to continue 2)分析下面程序,指出程序运行的结果: #include 第八章继承与多态习题 一.基本概念与基础知识自测题 8.1填空题 8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。(3)类 的对象可作为(4)类的对象处理,反过来不行,因为(5)。如果强制转换则要注意(6)。 答案:(1)基类 (2)派生类 (3)派生类 (4)基类 (5)派生类有一些新成员 (6)只能派生类强制转换为基类 8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员, protected成员成为派生类的(2)成员,对private成员是(3)。公有派生可以使其类的(4),所以公有派生是主流。 答案:(1)public成员 (2)protected成员 (3)不可访问 (4)接口不变 8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.6 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.2简答题(以下习题题号可能和教材不一致!) 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)? 实验十六运算符重载 一、实验目的 1、理解运算符重载作用和意义; 2、掌握类运算符和友元运算符重载的定义和使用; 3、掌握常用运算符(++、--、+、-、*、/、=、+=、-=、*=、/=、<<(插入)、>>(提取))的重载。 二、实验内容 1、下列程序定义了一个复数类,重载"+"运算符以实现复数的加法运算。 #include 第九章继承与派生类 9.2 典型例题分析与解答 例题1:下列对派生类的描述中,()是错误的。 A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 答案:D 分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有 成 的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。 例题4:多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数 B.虚基类的构造函数 C.非虚基类的构造函数D.派生类中子对象类的构造函数 答案:B 分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。 例题5:C++类体系中,能被派生类继承的是()。 A.构造函数B.虚函数C.析构函数D.友元函数答案:B 分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的. 例题6:设有基类定义: class Cbase { private: int a; protected: int b; public: int c; }; 用派生类中子对象类的析构函数,最后调用基类的析构函数。 例题11:设有以下类的定义: class A class B: protected A class C: private B { int A1; { int b1; { int c1; protected: int A2; protected: int b2; protected: int c2; public: int A3; public: int b3; public: int c3; }; }; }; 请按访问权限写出派生类C中具有的成员。 私有成员: (1) 实验5 运算符重载 1.实验目的 通过本次实验 (1)理解运算符重载函数的概念; (2)掌握运算符重载函数的定义与使用方法; 2.实验要求 (1)编写实验程序 (2)在运行环境中,输入源程序 (3)编译运行源程序 (4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容 (1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。 (2)定义一个数组类Array,其私有数据成员为整型一维数组a[10]。通过构造函数给a[10]赋初值。用Show函数显示a[10]的元素值。用成员函数重载运算符“+”,直接实现两个一维数组对应元素相加的运算。在主函数中定义数组a、b分别为: int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10]={4,5,6,7,8,9,10,11,12,13}; 用Array定义三个数组对象arr1(a)、arr2(b)、arr3,执行arr3=arr1+arr2运算,输出arr3的数组元素值。 (3)定义一个人民币类Money,类中数据成员为元、角、分。用成员函数与友元函数重载“――”运算符,实现人民币对象的减1运算。在主函数中定义人民币对象m1=10元8角5分及对象m2、m3。对m1作前置“――”并赋给m2。对m1作后置“――”并赋给m3。显示m1、m2、m3的结果。 (4)定义描述字符串的类String,编写字符串运算符“+=”的重载函数,使运算符“+=”用于两个字符串联接操作,即用str1+=str2实现字符串函数strcat(str1,str2)的操作功能。要求分别用成员函数与友元函数编写运算符重载函数。在主函数中定义字符串对象s1("software and ")与s2("hardware"),进行s1+=s2的字符串联接,并输出s1、s2的值。 1. 类的继承与派生综合题1 题目描述 定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类。 要求: a.在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员:销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员:经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其他数据成员。 b.各类人员的实发工资公式如下: 员工实发工资=基本工资+奖金*出勤率 销售员实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例 经理实发工资=基本工资+奖金*出勤率+总销售额*经理提成比例 销售经理实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例+总销售额*经理提成比例 c.每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。 主函数如下: int main() { Salemanobjsale(101101, "LD", 0.88f, 1200, 800, 0.05f, 10000); Manager objmana(101102, "NXG", 0.90f, 2500, 1000, 0.10f, 20000); SaleManagerobjsalemana(101103, "HDY", 0.99f, 3500, 2000, 0.20f, 100000, 0.20f,150000); objsale.Output(); cout<< "销售员的实发工资:" << " "; cout<c++实验8 继承与派生上机练习题
继承和派生实验报告
实验二 类的继承与派生
实验四:派生类和继承(一)
实验五 运算符重载
继承与多态习题
Student类(友元,运算符重载,继承)综合题
实验十_运算符重载
C 第八章继承与派生习题习题解答
实验十六运算符重载解读
C++继承与派生类习题
实验5 运算符重载
类的继承与派生综合题