1、天津理工大学C+期末考试实验一 一、明确的概念:(1)理解类和对象的概念;(具体见附一) 类是抽象的 对象是具体的 例如:你、我、他 都是人 那么 你、我、他就是对象 人就是类(2)掌握类与对象的定义方法; 类的定义:class 类名 /*定义这个类*/; 员名或成员函数 不能通过外部直接访问(不声明访问属性时 系统默认为私有) 当出现对象名.成员(私有)时 编译器报错 与private类似 但protected属性的成员可以继承 private不能继承(4)掌握构造函数和析构函数的含义与作用、定义方式和实现; 构造函数:为数据成员开辟存储空间 函数名必须与类名相同 之前绝对不许说明返回值类型
2、 void也不行 构造函数不能由用户调用 即:对象名.构造函数名(参数)是错误的 构造函数是随着对象的声明而调用的 例如: class StudentStudent()cout”Hello.”endl; Int main(void)cout”Hello.”endl;Student A;运行结果: Hello. endl; int getx()return x; int gety()return y;private: int x, y;Coordinate:Coordinate(Coordinate &p)endl;int main() Coordinate p1(3,4); Coordinat
3、e p2(p1); Coordinate p3=p2; coutp3=(),()endl; return 0;(1)记录程序的运行结果(2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增加如下语句:cout”Constructor is called.”endl; 重新记录程序的运行结果,并解释输出结果。(3)按下列要求进行测试。在主函数体内,添加如下语句:Coordinate p4; 错误原因:构造函数没有参数 构造函数为Coordinate:Coordinate(int ,int)Coordinate p5(2); 错误原因:参数数量不对1.根据注释语句的提示实现类
4、Date的成员函数,并将完整的程序编译、连接成功以保证程序能够正确运行。#include class Datepublic: void printDate(); 分析:1.题目中 Date类的数据成员为day, month, year 且均为整型访问属性为私有 主函数中声明了testDay对象2.数据成员均为私有 则不能通过=的方法来设置 题目中给出了 void setDay(int) void setMonth(int) 和void setYear(int)三个成员函数去是指day month 和 year 的值 还有一个void printDate()来输出3.准备工作结束 开始编程 看程
5、序 仅差4个成员函数未定义 类外定义 要写出作用域 即该函数属于哪个类: 格式: 返回值类型 作用域:函数名 参数表 void Date:setDay (int d)/*定义时必须要给形参一个名字 这里给的是*/d day=d证结果 出现溢出数据时查看是否写反了 例如写成d=day 了解设置函数的作用机制 见附二 下面是一个计算器类的定义,请完成该类的成员函数的实现,并设计一个主函数使用该类和相关成员函数以测试该类设计的正确性。#include using namespace std;class counterpublic: counter(int number=0) 定义一个类ClsName
6、,要求该类设计如下:(1)该类有两个整型数据成员x和y;(2)为该类重载三个不同的构造函数:分别为无参数、带一个参数和带两个参数的构造函数,要求在构造函数中输出必要的信息以示区别;(3)设计2个成员函数用来读取数据成员x和y;(4)设计2个成员函数用来设置数据成员x和y;(5)设计1个成员函数用来在屏幕上打印输出数据成员x和y;(6)在main()函数中用三个不同的构造函数创建3个对象,并使用所有的成员函数对这些对象进行必要的操作。class ClsNamepublic: int a,b; ClsName(int a,int b)coutConstruct by two numbers.end
7、l;x=a,y=b; endl;x=a,y=b;endl;x=a,y=b; int getx()return x; 因为x,y的访问属性为私有,不能由主函数直接访问 所以会设置读取函数专门负责返回相应的值重载:函数名相同,参数的类型不同或者个数不同、或者都不同。 即根据带入参数的类型、数量的不同,来实现不同的功能 int gety()return y; void setx()coutx; void sety()couty; void print()coutX=getx()tY=gety()endl;private: int x,y; (1)中要求的两个整型数据成员;int main() int
8、 a,b; coutTest1:Input with 2 numbers, now please input two numbers:a;cinb; ClsName t1(a,b); (); ();(); (); couta; ClsName t2(a); (); ();(); (); coutnTest3:Without numbers; ClsName t3; (); ();(); (); return 0;5. 建立类cylinder,包括两个数据成员radius和height,分别表示圆柱体的半径和高度, cylinder类的构造函数被传递了两个double值来初始化这两个成员;定义成
9、员函数area()和volume用来求圆柱体的表面积和体积,定义成员函数print()打印cylinder类的相关信息。最后,在主函数中对cylinder类的设计进行测试。这题很简单 没啥说的#includeclass cylinderpublic: void set(double r,double h)radius=r,height=h; double area()return (radius*; double volume()return (height*area(); void print()coutArea=area()tVolume=volume()endl;private: dou
10、ble radius,height;int main() int a,b; cylinder v; couta; coutb; (a,b); (); return 0;6.定义一个学生类CStudent实现简单的学籍管理功能,要求该类至少实现以下功能:(1) 录入学生的基本信息(包括姓名,学号,性别,年龄,专业,入学时间,各门功课成绩)(2) 输出学生的基本信息(3) 选课(输入时间和所选的课程)(4) 统计每门课的学分绩点(5) 统计每学期的平均学分绩点(6) 统计重考科目(7) 统计重修科目#include#includeusing namespace std;const MAX=4;cl
11、ass CStudent string name,sex,ID,object,jtime;endl; for(int i=0;iMAX;i+) coutsbji; coutmarki; void baseprint() .相当于score=score+. 无法确定第一个score的值 retry=0; for(i=0;i=60)score+=m_marki; 2010-3-23”,否则会导致部分功能不正常(5)掌握静态数据成员和静态成员函数的使用方法; 例如:有Object类,拥有数据成员a,由Object类声明出的对象A、B、C,那么A、B、C都拥有各自的a,内存中也会分配出各自的内存空间A
12、:a,B:a,C:a(共3个)。而如果将数据成员a声明为静态成员(static),那么A、B、C则共用一个内存空间a(只有1个) 最典型的例子是统计声明对象的数量使用方法:static 数据类型 数据成员名由于不能直接对数据成员赋初值 所以静态数据成员初始化方法为: 数据类型 类名:静态数据成员名=初值(注意:1.是类名,不是对象名;2.之前不要加static)静态成员函数静态成员函数属于整个类 而不是某个对象 所以调用方法为 类名:静态成员函数名(参数表)其他参看书P103几点说明练习项目Time类的框架定义如下:#include计一个用来表示直角坐标系的Location类,在主程序中创建类
13、Location的两个对象A和B,要求A的坐标在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果:A(x1, y1), B(x2, y2)Distance1=d1Distance2=d2其中:x1, x2, y1, y2为指定的坐标值,d1和d2为两个坐标点之间的距离。Location类框架可参考如下:#include#includeclass Location ;private: double x,y;Location:Location(double a,double b) x=a; y=b;double Location:Get
14、x() return x;double Location:Gety() return y;double Location:distance1(Location &L) return sqrt(*+*);int main() double a,b; cout输入A点坐标(在第二象限):endl; coutx(xa; if(a0)break; cout不对,再来一次:; cout0):; for(;) cinb; if(b0)break; cout不对,再来一次:; Location A(a,b); cout输入B点坐标(在第四象限):endl; cout0):; for(;) cina; if(
15、a0)break; cout不对,再来一次:; couty(yb; if(b0)break; cout不对,再来一次:; Location B(a,b); coutA(),()endl; coutB(),()endl; coutDistance1=(B)endl; coutDistance2=distance2(A,B)endl; return 0;3.使用C+的string类,将5个字符串按逆转后的顺序显示出来。例如,逆转前的5个字符串是:Germany Japan America Britain France逆转后的顺序输出字符串是:France Britain America Japan
16、 Germany#include#includeusing namespace std;int main(void) string str1,str2,str3,str4,str5; cinstr1str2str3str4str5; coutstr5 str4 str3 str2 str1endl; return 0;4.设计一个模仿类magic来实现4*4的魔方阵。类的框架如下:#includeusing namespace std;class magic 5.声明一个Employee类,数据成员包括:一个long型的id,两个字符指针成员,代表职员的姓名和家庭住址,一个double数据,代
17、表月薪。成员函数有:构造函数、析构函数、set_salary()和get_salary()代表修改和获取薪资、set_name()和get_name()代表修改和获取姓名、set_address()和get_address()代表修改和获取家庭住址,set_id()和get_id()用来修改获取当前职员的id号。在主程序中,创建对象数组调用上述函数以测试Employee类设计的正确性。Employee类的框架可参考:#include#includeusing namespace std;class Employee et_id(a); p=new char1000; coutp; sj.set
18、_name(p); p=new char1000; coutp; sj.set_address(p); coutb; sj.set_salary(b); for(j=0;ji;j+) sj.print(); return 0;6.声明一个Student类,在该类中包括一个数据成员:score(代表课程成绩)、两个静态数据成员:total_score(代表总分),count(代表学生总人数)。成员函数有:构造函数、析构函数、account(int)用于设置分数、静态成员函数sum()返回所有学生的总成绩、静态成员函数average()返回所有学生的平均成绩、print()用于打印当前学生对象的成
19、绩等。在主程序中,输入某班同学的成绩,并调用上述函数打印全班同学的成绩、求出全班学生的成绩之和与平均分等。Student类的框架可参考:#include#includeusing namespace std;class Student ccount(a); cout输出全班成绩:0) s-i.print(); if(j+%6=0)coutendl; s0.print2(); return 0;注意:静态成员和非静态成员的初始化方式的区别。实验三 派生与继承(2010-3-23)二、实验名称:派生与继承。三、实验目的:(1)理解继承的含义,掌握派生类的定义方法和实现;继承就是子承父类 看书注意格
20、式 私有成员不能继承 父类的保护成员继承成变为子类的私有成员(2)理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员;(3)理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;(4)理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。四、练习项目1.先定义“点”类Point,再由“点”类派生出“圆”类Circle。#include #define PI class Point 多重继承中基类构造函数和析构函数的调用顺序#include class
21、Base1protected: int data1;public: Base1(int a=0) data1 = a; coutBase Constructor1n; Base1( ) coutBase Destructor1n; ;class Base2protected: int data2;public: Base2(int a=0) data2 = a; coutBase Constructor2n; Base2( ) coutBase Destructor2n; ;class Derived: public Base1, public Base2 int d;public: Deri
22、ved(int x, int y, int z):Base1(x), Base2(y) d=z; coutDerived Constructorn; Derived( ) coutDerived Destructorn; void Show( ) coutdata1,data2,dendl; ;void main( ) Derived c(1, 2, 3); ( );(1)记录程序的运行结果运行结果:Base Constructor1Base Constructor2Derived Constructor1,2,3Derived DestructorBase Destructor2Base D
23、estructor1Press any key to continue要求记住调用顺序4.对象成员构造函数和析构函数的调用顺序#include class Base1protected: int data1; public: Base1(int a=8) data1 = a; coutdata1, Base Constructor1n; Base1( ) coutdata1, Base Destructor1n; ;class Base2protected: int data2;public: Base2(int a=9) data2 = a; coutdata2, Base Construc
24、tor2n; Base2( ) coutdata2, Base Destructor2n; ;class Derived:public Base1, public Base2 int d; Base1 b1, b2; public: Derived(int x, int y, int z) : Base1(x), Base2(y), b1(x+y), b2(x+z) d=z; coutDerived Constructorn; Derived( ) coutDerived Destructorn; void Show( ) coutdata1,data2,dendl; ;void main(
25、) Derived c(1, 2, 3); ( );(1)记录程序的运行结果1, Base Constructor12, Base Constructor23, Base Constructor14, Base Constructor1Derived Constructor1,2,3Derived Destructor4, Base Destructor13, Base Destructor12, Base Destructor21, Base Destructor1Press any key to continue5. 编程题假设某商店有如下几种货品:衬衣、帽子、立柜。每一种货物都有与其关联
26、的说明信息。衬衣:单价、产地、库存量、布料;帽子:单价、产地、库存量、布料、样式(平顶或尖顶);立柜:单价、产地、库存量、木料、颜色。对这些商品的操作有:商品的进库(增加库存量),商品的出库(减少库存量),该类货品总价格的计算。要求自行设计数据结构,用类的继承与派生关系将上述的各种货品表示出来,并使用类的构造函数来初始化每一类对象的初始数据。而后将上述的商品管理计算机化,完成操作要求的功能。【实现方法提示】1设立3 个不同的类来描述与处理3 种不同的货品。首先注意到上述3 种货品数据之间的相互关联关系,可使用C+基类及其派生类的定义方法,先抽象出(“提取”出)如下每一货品都具有的 “公有”数据构成一个所谓的基类base,而后再派生出所需的那3 个类。(1)base(基)类:单价、产地、库存量;(2)由base 作为基类,派生出shirt(衬衣)类:增加“布料”数据;(3)由base 出发,派生出wardrobe(立柜)类:增加“木料”与“颜色”数据;(4)而后又由shirt 类出发(作为基类),派生出cap(帽子)类:增加“样式”数据。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1