




免费预览已结束,剩余36页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+面向对象程序设计实验指导 C+语言面向对象程序设计是一门实践性很强的课程,学好这门课程离不开实验这一重要环节。学生不仅应具有扎实的理论知识,还要通过坚持不懈地阅读程序、编程练习、程序调试、程序改错等环节的训练,才能真正掌握所学知识,提高编程水平。对于初学者,可能会看程序但不会编写,程序调试时出现了问题不会纠错,这些都是正常现象,实际还是编程训练不够,只要勤学多练,最后一定可以取得令人满意的效果。包括5个实验,每个实验都包括实验目的、实验内容、实验提示与实验步骤。实验内容一般都包含有阅读程序与调试程序,程序改错,程序填空与编写程序方面的题目,这些题目也是C+面向对象程序设计考试要涉及的题型,因此做好实验对考试有极大的帮助;实验提示信息中有编程提示、重要内容提示或者出错信息提示;实验步骤以一个实际题目为例给出具体而实用的指导,让便让初学者不至于面对实验题目而束手无策,希望读者在实验中的能够学有所思,有所启迪。实验1 类和对象1.1 实验目的1掌握类的定义和使用方法,掌握类对象的声明和使用方法。2掌握对象的初始化和赋值的方法。3了解成员函数的特性、友元。4静态成员的使用方法。5理解和掌握this指针的用法。6理解和掌握const类型数据的使用。1.2 实验工具与准备工作在开始实验前,应回顾或复习相关内容。需要一台主算机,其中安装有Visual C+ 6.0、Visual C+ 2005、Visual C+ 2005 Express、Dev-C+或MinGW Developer Studio等集成开发环境软件。1.3 实验内容1先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 直角坐标类class Pointprivate:/ 数据成员:int x, y;/ 横坐标与纵坐标public:/ 公有函数:Point(int a, int b): x(a), y(b) / 构造函数void Set(int a, int b);/ 设置坐标值int GetX() const return x; / 返回横坐标int GetY()const return y; / 返回纵坐标;/ 直角坐标类及相关函数的实现部分void Point:Set(int a, int b)/ 设置坐标值x = a;/ 横坐标y = b;/ 纵坐标void Show(const Point &pt)/ 显示坐标值 cout pt.GetX() pt.GetY() Set(5, 9);/ 设置坐标值a3.Set(6, 8);/ 设置坐标值for (int i = 0; i 5; i+)/ 依次显示各对象的坐标值Show(*p+); system(PAUSE); / 调用库函数system( ),输出系统提示信息 return 0; / 返回值0,返回操作系统2先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 日期类class Dateprivate:/ 数据成员:int month, day, year;/ 年月日public:/ 公有函数: Date(int m = 1, int d = 1, int y = 2008);/ 构造函数/ 友元friend void Show(const Date &dt);/ 显示日期;/ 日期类及相关函数的实现部分Date:Date(int m, int d, int y)/ 由m(月),d(日)和y(年)构造对象 this-month = m;/ 月this-day = d;/ 日this-year = y;/ 年void Show(const Date &dt)/ 显示日期cout dt.month / dt.day / dt.year endl;int main(void)/ 主函数main(void)Date d1(6, 8, 2008), d2(6, 18), d3(5), d4;/ 定义日期对象Show(d1);/ 显示d1Show(d2);/ 显示d2Show(d3);/ 显示d3Show(d4);/ 显示d4 system(PAUSE); / 调用库函数system( ),输出系统提示信息 return 0; / 返回值0,返回操作系统3程序填空。下面程序主要测试静态成员的使用方法,请完成程序。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 测试静态成员类class Testprivate:/ 数据成员:static int count;/ 对象数public:/ 公有函数:Test() count+; / 构造函数, 实现对对象进行计数static void Show() cout 共有 count 个对象! endl; / 显示对象数; 1 count = 0;/ 为静态数据成员赋初值int main(void)/ 主函数main(void)Test obj1, obj2, obj3;/ 定义对象Test:Show();/ 显示对象数system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0,返回操作系统4改正下面程序中的错误,使其能正常运行。/ 文件名: main.cpp/1#include / 预处理命令/2using namespace std;/ 使用标准命名空间std/3/4/ 测试构造函数与析构函数类/5class Test/6/7public:/8/ 公有函数:/9void Test() cout 构造函数 endl; /10void Test() cout 析造函数 Set(5, 9);/ 设置坐标值用于修改对象数组的a0的值,而语句a3.Set(6, 8);/ 设置坐标值用于修改对象数组的a3的值。2注意缺省参数值的使用;对于私有数据成员,可使用友元进行访问。3中静态数据成员赋初值的一般形式如下:数据类型类名:静态数据成员名=初值;参考答案为:1int Test:4构造函数与析构函数不能有返回值类型,因此应去掉第10行和第11行的void。5只要按题目要求编程实现即可,建议将比较短的函数在类体中实现,比较长的函数在类体外实现。6可仿照第5题编程实现,当然学生现实后还可灵活处理,比如定义学生数组存储学生信息,由count的值作为学号(此时构造函数的参数中不需要学号的信息)。1.5 实验步骤以实验内容第5题为例说明实验步骤。具体实现步骤如下:1建立工程exp2_5。2建立源程序文件main.cpp,具体内容如下:/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 人(people)类class Peopleprotected:/ 数据成员:int age;/ 年龄int height;/ 身高int weight;/ 体重static int num;/ 人数public:/ 公有函数:People(int a, int h, int w);/ 构造函数void Eatting() weight+; / 进食使体重加1void Sporting() height+; / 运动使身高加1void Sleeping();/ 睡眠void Show() const;/ 显示人的信息static void ShowNum()/ 显示人数 cout 人数: num endl; ;int People:num = 0;/ 初始化静态数据成员num/ 人(people)类的实现部分People:People(int a, int h, int w): age(a), height(h), weight(w) num+; / 由已知信息构造对象, 人数num将自加1void People:Sleeping()/ 睡眠age+;/ 睡眠使年龄加1height+;/ 睡眠使身高加1weight+;/ 睡眠使体重加1void People:Show() const/ 显示人的信息cout 第 num 个人: endl;/ 显示人的序号cout 年龄: age 岁 endl;/ 显示年龄cout 身高: height 厘米 endl;/ 显示身高cout 体重: weight 市斤 endl;/ 显示体重cout endl;/ 换行int main(void)/ 主函数main(void)People obj1(8, 120, 60);/ 定义对象obj1.Eatting();/ 进食obj1.Sporting();/ 运动obj1.Sleeping();/ 睡眠obj1.Show();/ 显示信息People obj2(18, 170, 108);/ 定义对象obj2.Eatting();/ 进食obj2.Sporting();/ 运动obj2.Sleeping();/ 睡眠obj2.Show();/ 显示信息People:ShowNum();/ 显示人数system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0,返回操作系统3编译及运行程序。1.6 测试与结论以实验内容第5题为例进行测试,测试时,屏幕显示如下:第1个人:年龄:9岁身高:122厘米体重:62市斤第2个人:年龄:19岁身高:172厘米体重:110市斤人数:2请按任意键继续. . .从上面的屏幕显示,可知本程序满足实验内容第5题的要求。实验2 继承与派生2.1 实验目的1熟练掌握类的继承,能够定义和使用类的继承关系。2掌握派生类的声明与实现方法。3掌握类构造函数的初始化列表与作用域分辨符的使用方法。4理解虚基类在解决二义性问题中的作用。2.2 实验工具与准备工作在开始实验前,应回顾或复习相关内容。需要一台主算机,其中安装有Visual C+ 6.0、Visual C+ 2005、Visual C+ 2005 Express、Dev-C+或MinGW Developer Studio等集成开发环境软件。2.3 实验内容1先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间stdclass Apublic:/ 公有函数:A() cout 构造A endl; / 构造函数A() cout 析构A endl; / 析构函数;class B: public Apublic:/ 公有函数:B() cout 构造B endl; / 构造函数B() cout 析构B endl; / 析构函数;class C: public Bpublic:/ 公有函数:C() cout 构造C endl; / 构造函数C() cout 析构C endl; / 析构函数;int main(void)/ 主函数main(void)C obj;/ 定义对象system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0, 返回操作系统2先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间stdclass Aprotected:/ 数据成员:int a;/ 数据成员public:/ 公有函数:A(int x): a(x) / 构造函数void Show() const cout a endl; / 显示a之值;class B protected:/ 数据成员:int b;/ 数据成员public:/ 公有函数:B(int x): b(x) / 构造函数void Show() const cout b endl; / 显示a与b之值;class C: public A, public B public:/ 公有函数:C(int x, int y): A(x), B(y) / 构造函数void Show() const/ 显示b之值 cout a , b endl; ;int main(void)/ 主函数main(void)C obj(5, 18);/ 定义对象obj.Show();/ 显示相关信息obj.A:Show();/ 显示相关信息obj.B:Show();/ 显示相关信息system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0, 返回操作系统3程序填空。下面程序主要测试类构造函数的初始化列表与作用域分辨符,请完成程序。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间stdclass Aprivate:/ 数据成员:int a;/ 数据成员public:/ 公有函数:A(int x): 1 / 构造函数void Show() const/ 显示a之值 cout a: a endl; ;class B: public A protected:/ 数据成员:int b;/ 数据成员public:/ 公有函数:B(int x, int y): 2 , b(y) / 构造函数void Show() const/ 显示相关信息 3 Show();/ 调用基类A的成员函数Show()cout b: b endl;/ 显示b之值;int main(void)/ 主函数main(void)B obj(5, 18);/ 定义对象obj.Show();/ 显示相关信息system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0, 返回操作系统4改正下面程序中的错误,使其能正常运行。/ 文件名: main.cpp/1#include / 预处理命令/2using namespace std;/ 使用标准命名空间std/3/4/ 基类Base/5class Base/6/7private:/8/ 数据成员:/9int m;/ 数据成员/10/11public:/12/ 公有函数:/13Base(int a): m(a) / 构造函数/14Base(const Base ©) : m(copy) / 复制构造函数/15void Show() const/ 显示m之值/16 cout m: m endl; /17;/18/19/ 派生灰Derived/20class Derived: private Base/21/22protected:/23/ 数据成员:/24int n;/ 数据成员/25/26public:/27/ 公有函数:/28Derived(int a, int b): b(a) n =b; / 构造函数/29void Show() const/ 显示相关信息/30/31Base:Show();/ 调用基类Base的成员函数Show()/32cout n: n endl;/ 显示n之值/33/34;/35/36int main(void)/ 主函数main(void)/37/38Derived obj(10, 18);/ 定义对象/39obj.Show();/ 显示相关信息/40/41system(PAUSE); / 调用库函数system( ),输出系统提示信息/42return 0; / 返回值0, 返回操作系统/43/445定义Person(人)类,由Person分别派生出Teacher(教师)类和Cadre(干部)类,再由Teacher(教师)类和Cadre(干部)类采用多重继承方式派生出新类TeacherCadre(教师兼干部)类,各类之间的继承关系如图1.1所示。图2.1 各类之间的继承关系要求:(1)在Person类中包含的数据成员有姓名(name)、年龄(age)、性别(sex)。在Teacher类还包含数据成员职称(title),在Cadre类中还包含数据成员职务(post),在TeacherCadre类中还包含数据成员工资(wages)。(2)在类体中定义成员函数。(3)每个类都有构造函数与显示信息函数(Show)。*6定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类,各类之间的继承关系如图1.2所示。图2.2 各类之间的继承关系要求:(1)在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。在Saleman类中还包含数据成员销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员经理提成比例(totalDeductRate)和总销售额(totalAmount)。在SaleManager类中不包含其它数据成员。(2)各类人员的实发工资公式如下:员工实发工资 = 基本工资 + 奖金 * 出勤率销售员实发工资 = 基本工资 + 奖金 * 出勤率 + 个人销售额 * 销售员提成比例经理实发工资 = 基本工资 + 奖金 * 出勤率 + 总销售额 * 经理提成比例销售经理实发工资 =基本工资 + 奖金 * 出勤率 + 个人销售额 * 销售员提成比例+ 总销售额 * 经理提成比例(3)每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。2.4 实验提示1在创建派生类的对象时,系统先执行基类的构造函数,再执行派生类的构造函数;当派生类对象消亡时,系统会自动调用派生类的析构函数做一些必要的清理工作,析构函数调用的顺序是先派生类的析构函数,然后是基类的析构函数。2在类构造函数的初始化列表中,不但可以有基类,例如C(int x, int y): A(x), B(y) 还可包含数据成员,例如A(int x): a(x) 如果基类与派生类有同名成员函数,可以通过作用域分辨符明确指定调用哪个类的成员函数,例如obj.A:Show();/ 调用基类A的成员函数Show()3知识点与第2题相同,读者应掌握构造函数的初始化列表与作用域分辨符的使用方法。参考答案为:1 a(x)2 A(x)3 A:4复制构造函数指构造函数以当前正在声明的类的对象作为参数,第15行就为复制构造函数的示例,在第15行的初始化列表中m(copy),由于m为整型,copy为对象,不能由copy直接由copy构造m,应改为Base(const Base ©) m = copy.m; / 复制构造函数/15或Base(const Base ©): m(copy.m) / 复制构造函数/15第29行的初始化列表中m(a)的m为基类Base的私有数据成员,对派生类Derived是不可见的,此处只能用基类名Base,具体修如下:Derived(int a, int b): Base(a) m =b; / 构造函数/295为避免多义性,凡是几个类之间的继承关系如图1.1所示的菱形相似的关系,最好将位于菱形最上面的类声明为虑基类。6可仿照第5题编程实现,学生现实后还可灵活处理,比如在Staff(员工)类中增加静态累加器count,用count值产生员工编号,增加输入经理基本信息函数(Input),在main函数中用一个简单菜单循环选择输入与输出各类人员的信息。2.5 实验步骤以实验内容第5题为例说明实验步骤。具体实现步骤如下:1建立工程exp3_5。2建立源程序文件main.cpp,具体内容如下:/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 人(Person)类class Personprotected:/ 数据成员:char name18;/ 姓名int age;/ 年龄char sex3;/ 性别public:/ 公有函数:Person(char nm, int ag, char sx)/ 构造函数/ 由已知参数nm(姓名), ag(年龄)和sx(性别)构造对象strcpy(name, nm);/ 姓名age = ag;/ 年龄strcpy(sex, sx);/ 性别void Show() const/ 显示相关信息 cout 姓名: name endl;/ 显示姓名cout 年龄: age endl;/ 显示年龄cout 性别: sex endl;/ 显示性别;/ 教师类class Teacher: virtual public Person protected:/ 数据成员:char title18;/ 职称public:/ 公有函数:Teacher(char nm, int ag, char sx, char tl): Person(nm, ag, sx)/ 构造函数 strcpy(title, tl); / 复制职称void Show() const/ 显示相关信息 Person:Show();/ 调用基类Person的成员函数Show()cout 职称: title endl;/ 显示职称cout endl;/ 换行;/ 干部类class Cadre: virtual public Person protected:/ 数据成员:char post18;/ 职务public:/ 公有函数:Cadre(char nm, int ag, char sx, char pt): Person(nm, ag, sx)/ 构造函数 strcpy(post, pt); / 复制职务void Show() const/ 显示相关信息 Person:Show();/ 调用基类Person的成员函数Show()cout 职务: post endl;/ 显示职务cout endl;/ 换行;/ 教师兼干部类class TeacherCadre: public Teacher, public Cadreprotected:/ 数据成员:double wages;/ 工资public:/ 公有函数:TeacherCadre(char nm, int ag, char sx, char tl, char pt, double wg): Person(nm, ag, sx), Teacher(nm, ag, sx, tl), Cadre(nm, ag, sx, pt) wages = wg; / 复制工资void Show() const/ 显示相关信息 Person:Show();/ 调用基类Person的成员函数Show()cout 职称: title endl;/ 显示职称cout 职务: post endl;/ 显示职务cout 工资: wages 元 endl;/ 显示工资cout endl;/ 换行;int main(void)/ 主函数main(void)Teacher objTeacher(文冠杰, 48, 男, 教授);/ 定义对象Cadre objCadre(周杰, 56, 男, 院长);/ 定义对象TeacherCadre objTeacherCadre(李靖, 50, 女, 教授, 院长, 6890);/ 定义对象objTeacher.Show();/ 显示相关信息objCadre.Show();/ 显示相关信息objTeacherCadre.Show();/ 显示相关信息system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0, 返回操作系统3编译及运行程序。2.6 测试与结论以实验内容第5题为例进行测试,测试时,屏幕显示如下:姓名:文冠杰年龄:48性别:男职称:教授姓名:周杰年龄:56性别:男职务:院长姓名:李靖年龄:50性别:女职称:教授职务:院长工资:6890元请按任意键继续. . .从上面的屏幕显示,可知本程序满足实验内容第5题的要求。实验3 函数重载与运算符重载3.1 实验目的1学习函数和操作符重载的使用方法。2理解函数和运算符重载的作用和意义。3掌握类运算符和友元运算符重载的定义和使用。4掌握常用运算符的重载。3.2 实验工具与准备工作在开始实验前,应回顾或复习相关内容。需要一台主算机,其中安装有Visual C+ 6.0、Visual C+ 2005、Visual C+ 2005 Express、Dev-C+或MinGW Developer Studio等集成开发环境软件。3.3 实验内容1先阅读下列程序,写出执行结果。然后输入程序,调试程序,比较结果的正确性。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 数组类class Arrayprivate:/ 数据成员:int *elem;/ 数组元素存储空间int size;/ 数组元素个数public:/ 公有函数:Array(int a, int sz): elem(a), size(sz) / 构造函数int GetSize() return size; / 返回数组元素个数int &operator(int pos) return elempos - 1; / 重载下标运算符;int main(void)/ 主函数main(void)int a = 1, 2, 3, 4, 5;/ 定义数组aArray obj(a, 5);/ 定义数组对象obj1 = 8;/ 为数组元素赋值for (int i = 1; i = obj.GetSize(); i+)/ 依次输出数组各元素之值cout obji ;/ 输出第i个元素cout endl;/ 换行system(PAUSE); / 调用库函数system( ),输出系统提示信息return 0; / 返回值0, 返回操作系统2程序填空。下面程序主要实现描述复数的类Complex的加法运算符+重载,试完成程序。/ 文件名: main.cpp#include / 预处理命令using namespace std;/ 使用标准命名空间std/ 复数类class Complexprivate:/ 数据成员:double realPart;/ 实部double imagePart;/ 虚部public:/ 公有函数:Complex(double real = 0, double image = 0): realPart(real), imagePart(image) / 构造函数double GetRealPart() const return realPart; / 返回实部double GetImagePart() const return imagePart; / 返回虚部 1 operator+(const Complex &a) const/ 重载加法运算符+Complex b;/ 定义复数对象b.realPart = this-realPart + a.realPart;/ 和的实部b.imagePart = this-imagePart + a.imagePart;/ 和的虚部return 2 ;/ 返回和;int main(void)/ 主函数main(void)Complex a(1, 2), b(2, 6), c;/ 定义复数对象c = a + b;/ 复数加法运算cout a= a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年初级攀岩指导员考试要点及面试技巧
- 2025年验船师考试(C级船舶检验专业实务)全真冲刺试题及答案二
- 2025年陪诊师考试技术能力试题及答案
- 2025年健康教育与促进工作者考试试题及答案
- 北京市门头沟区2024-2025学年八年级上学期期末考试生物考试题目及答案
- 2025年电视节目拍摄用无人机驾驶员笔试预测试题及解析
- 广西银行面试题库及答案
- 2025年从入门到精通放射医学技术面试全攻略及高频问题解析
- 样品前处理相关培训课件
- 2025年旅游规划与管理专业题库解析
- 2025-2030超大型矿用卡车电动化转型技术路线及成本效益分析
- 2025至2030中国太阳能发电中的水泵行业发展趋势分析与未来投资战略咨询研究报告
- 中小学教师中高级职称答辩备考试题及答案(50题)
- 2025年药品监管与安全知识考试卷及答案
- 大讲堂+管理办法
- 高中班级常规管理课件
- 销售部区域划分管理办法
- 超声波龈下刮治术专题讲解
- 2025年电信传输工程师职称考试试题
- 小学一年级升二年级暑假数学作业-58套计算
- 2025年思想政治理论知识测试与能力考试试题及答案
评论
0/150
提交评论