C++面向对象程序设计实验指导书
(v1.0)
刘恒洋 谭智编
重庆工学院计算机学院
2007年9月
C++面向对象程序设计实验指导书 目录
目录
绪论 .................................................................................................................................................. 1
0.1 写本书的目的 .................................................................................................................... 1 0.2 本书的结构安排 ................................................................................................................ 1 0.3 如何使用本书 .................................................................................................................... 2 实验一 C++基础 ............................................................................................................................. 3
1.1 实验目的 ............................................................................................................................ 3 1.2 实验内容 ............................................................................................................................ 3
1.2.1 程序阅读 ................................................................................................................. 3 1.2.2 程序设计 ................................................................................................................. 6 1.3 思考题 ................................................................................................................................ 7 实验二 类和对象—类的构建 ......................................................................................................... 8
2.1 实验目的 ............................................................................................................................ 8 2.2 实验内容 ............................................................................................................................ 8
2.2.1程序阅读 .................................................................................................................. 8 2.2.2 程序设计 ............................................................................................................... 10 2.3思考题 ............................................................................................................................... 10 实验三 类和对象—构造函数与析构函数 ................................................................................... 11
3.1 实验目的 .......................................................................................................................... 11 3.2 实验内容 .......................................................................................................................... 11
3.2.1程序阅读 ................................................................................................................ 11 3.2.2 程序设计 ............................................................................................................... 12 3.3思考题 ............................................................................................................................... 13 实验四 类和对象—对象传递与静态成员 ................................................................................... 14
4.1 实验目的 .......................................................................................................................... 14 4.2 实验内容 .......................................................................................................................... 14
4.2.1程序阅读 ................................................................................................................ 14 4.2.2 程序设计 ............................................................................................................... 17
实验五 派生与继承—单重派生 ................................................................................................... 18
5.1 实验目的 .......................................................................................................................... 18 5.2 实验内容 .......................................................................................................................... 18
5.2.1程序阅读 ................................................................................................................ 18 5.2.2 程序设计 ............................................................................................................... 20
实验六 派生与继承—多重派生 ................................................................................................... 21
6.1 实验目的 .......................................................................................................................... 21 6.2 实验内容 .......................................................................................................................... 21
6.2.1程序阅读 ................................................................................................................ 21 6.2.2 程序设计 ............................................................................................................... 24 6.3思考题 ............................................................................................................................... 24 实验七 多态性—函数与运算符重载 ........................................................................................... 25
7.1 实验目的 .......................................................................................................................... 25 7.2 实验内容 .......................................................................................................................... 25
7.2.1程序阅读 ................................................................................................................ 25
I
C++面向对象程序设计实验指导书 目录
7.2.2 程序设计 ............................................................................................................... 27 7.3思考题 ............................................................................................................................... 28 实验八 多态性—类型转换与虚函数 ........................................................................................... 29
8.1 实验目的 .......................................................................................................................... 29 8.2 实验内容 .......................................................................................................................... 29
8.2.1程序阅读 ................................................................................................................ 29 8.2.2 程序设计 ............................................................................................................... 31 8.3思考题 ............................................................................................................................... 31 实验九 模板类的构造 ................................................................................................................... 32
9.1 实验目的 .......................................................................................................................... 32 9.2 实验内容 .......................................................................................................................... 32
9.2.1程序阅读 ................................................................................................................ 32 9.2.2 程序设计 ............................................................................................................... 34 9.3思考题 ............................................................................................................................... 34 实验十 C++的I/O流类库 ............................................................................................................ 35
10.1 实验目的 ........................................................................................................................ 35 10.2 实验内容 ........................................................................................................................ 35
10.2.1程序阅读 .............................................................................................................. 35 10.2.2 程序设计 ............................................................................................................. 36 10.3思考题 ............................................................................................................................. 36 实验十一 C++程序、Windows程序和MFC程序 ..................................................................... 38
11.1 实验目的 ........................................................................................................................ 38 11.2 实验内容 ........................................................................................................................ 38
11.2.1 实验描述 ............................................................................................................. 38 11.2.2 实验步骤 ............................................................................................................. 39 11.2.3 实验结果分析 ..................................................................................................... 45 11.3思考题 ............................................................................................................................. 47 实验十二 简单单文档MFC程序设计 .................................................................................. 48
12.1 实验目的 ........................................................................................................................ 48 12.2 实验内容 ........................................................................................................................ 48
12.2.1 实验描述 ............................................................................................................. 48 12.2.2 实验步骤 ............................................................................................................. 49 12.2.3 实验结果 ............................................................................................................. 54 12.3思考题 ............................................................................................................................. 55 实验十三 简单对话框程序设计 ............................................................................................. 56
13.1 实验目的 ........................................................................................................................ 56 13.2 实验内容 ........................................................................................................................ 56
13.2.1 实验描述 ............................................................................................................. 56 13.2.2 实验步骤 ............................................................................................................. 56 13.2.3 实验结果 ............................................................................................................. 63 13.3思考题 ............................................................................................................................. 63 实验十四 简单数据库程序设计 ............................................................................................. 65
14.1 实验目的 ........................................................................................................................ 65 14.2 实验内容 ........................................................................................................................ 65
II
C++面向对象程序设计实验指导书 目录
14.2.1 实验描述 ............................................................................................................. 65 14.2.2 实验步骤 ............................................................................................................. 66 14.2.3 实验结果 ............................................................................................................. 73 14.3思考题 ............................................................................................................................. 74 综合练习 ........................................................................................................................................ 75 总结 ................................................................................................................................................ 76 参考书目 ........................................................................................................................................ 77
III
C++面向对象程序设计实验指导书 绪论
绪论
0.1 写本书的目的
面向对象程序设计语言是现今最流行的编程语言之一,C++语言是作为最早最流行的面向对象编程语言之一而发展起来的。学好C++语言不仅可以从面向过程的程序设计思想过渡到面向对象的程序设计思想,而且可以为以后学习其它的面向对象语言打下坚实的基础,使得学习其它的面向对象编程语言变得轻松、容易。 实验作为学习C++语言不可缺少的一个环节不仅可以加深学生对C++面向对象思想的理解,同时可以提高学生的动手编程能力,培养学生良好的编码习惯。目前关于C++语言的理论教材比较多,但是适合学生练习的实验指导书却比较少,这严重影响了学生对C++这门课程的学习。大多数情况下,学生学习C++语言之前都刚刚学习过C语言程序设计这门课程,从编程环境到编程语言同时转换过来需要一定的时间和合理的指引,同时在学习C++理论知识的过程中,学生很少也很难把C++程序设计和现在社会上比较流行的基于VC6.0的MFC程序设计联系起来,所以很难让学生在学习C++语言的同时,提升学生基于VC6.0的MFC程序设计的能力。编写本书的目的就是从以上几点来考虑的,首先要把学生从以前的编程环境中脱离出来,然后循序渐进地介绍新的编程环境的新知识点,同时把C++的语法结构融入到基于VC6.0的MFC程序设计中去,从而实现学生轻松掌握C++这门程序设计语言和习惯编程环境以及理解C++语法和MFC之间的关系的目的,从而提高学生的程序设计能力和学生程序设计的成就感。
0.2 本书的结构安排
实验课程的安排离不开理论课程的学习,本书的编排以知识点为核心,理论教材蓝本为《C++面向对象程序设计教程》(第2版)陈维兴 林小茶编著,清华大学出版社出版。通过为不同的知识点设计相应的实验程序,来达到学生练习和理解C++语言面向对象的思想的目的,同时本书还设计了一些程序设计课后练习题,设计本部分有三个目的:一个是有些课堂练习中没有办法练习到的知识点将在这部分体现,指导老师可以根据需要来增删课堂的讲解内容;另一个是为一部分有能力有兴趣深入学习C++程序设计的同学提供一些练习题,从而提升这部分学生的程序设计能力;第三就是避免有些学生在做实验的过程中盲目按照指导书中的步骤一步一步地不加思考地写程序,学生要回答这些问题,就必须看懂这些程序中隐含的知识点,从而达到理论知识和实践知识更好地结合。 对于课堂练习,本书共安排了十个实验,共32个学时,实验安排如下: 实验一 C++基础 (2学时) 实验二 类和对象—类的构建 (2学时) 实验三 类和对象—构造函数与析构函数 (2学时) 实验四 类和对象—对象传递与静态成员 (2学时) 实验五 派生与继承—单重派生 (2学时) 实验六 派生与继承—多重派生 (2学时) 实验七 多态性—函数与运算符重载 (2学时)
1
C++面向对象程序设计实验指导书 绪论
实验八 多态性—类型转换与虚函数 (2学时) 实验九 模板类的构造 (2学时) 实验十 C++的I/O流类库 (2学时) 实验十一 C++程序、Windows程序和MFC程序 (3学时) 实验十二 简单单文档MFC程序设计 (3学时) 实验十三 简单对话框程序设计 (3学时) 实验十四 简单数据库程序设计 (3学时) 另外本书还安排了第三部分—综合练习,作为学生提高部分,学生通过第三部分的练习不仅可以巩固前面学到的基本知识,还可以扩充相关方面的程序设计知识,更为重要的是可以让学生自主地设计一个完整的系统,从而达到提高学生综合程序设计能力的目的。
0.3 如何使用本书
面向对象程序设计语言出现的目的就是为了设计大型的软件系统,但是教学过程中很难让学生在课堂上实现一个大型的(甚至是成型)的系统,所以作为教师应该引导学生在实现一个简单的功能性的程序的同时让学生思考,思考如何把这个地方的技术实现到一个复杂的应用系统中去;另外教师要充分利用本书中第二部分的练习,引导学生去思考如何利用C++的相关技术从头到尾设计一个具有实用价值的应用程序。
作为学生如果只是简单地按照本书中提供的步骤一步一步完成某一个程序,而不去思考为什么要这样做的话,那么学生能学到的知识也仅仅是C++的语法而已,并不能真正理解C++面向对象的思想,最终不能设计出好的程序来。所以学生不仅要全部实现本书中的课堂练习,得出正确的结果,而且在完成了程序后还要思考本程序为什么要这样设计,如果换成其它的程序设计语言会怎么实现,只有这样才能够真正理解C++的精髓,从而掌握C++。
另外学生在学习最后四个实验的时候一定不要忘记前面C++语法知识,能否合理地将C++的三大特性运用到MFC的程序设计中是提高程序运行效率,存储效率和程序封装性一个最有效的手段。
学生在设计本实验指导书第三部分程序的时候,需要自己查阅相关方面的技术资料才能完成相关功能,因为安排这部分的目的就是为了提升学生自主学习的能力和综合程序设计能力,因此这部分的内容并没有安排相关理论知识的讲解。另外教师也可以把这部分的内容用于学生课程设计的程序设计题目。
注:本书中所有的程序都采用VC++6.0(英文版)编程环境,并且全部在该环境下编译运行通过!
2
C++面向对象程序设计实验指导书 实验一
实验一 C++基础
1.1 实验目的
1.进一步了解和熟悉VC++6.0开发环境,学会在VC++6.0环境下调试程序; 2.熟悉C++中简单的标准输入输出函数的实用;
3.理解const修饰符的作用,并学会应用const修饰符; 4.理解内置(内联)函数的优缺点并学会使用内置函数; 5.理解和使用函数重载以及带默认参数的函数; 6.使用new和delete进行动态内存管理; 7.理解和使用引用。
1.2 实验内容 1.2.1 程序阅读
1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。
#include int max_def(int x, int y) { return (x>y?x:y); } int max_def(int x, int y, int z) { int temp = 0; return (temp=(x>y?x:y))>z?temp:z; } double max_def(double x, double y) { return (x>y?x:y); } int main() { int x1 = 0; int x2 = 0; double d1 = 0.0; double d2 = 0.0; x1 = max_def(5,6); 3 C++面向对象程序设计实验指导书 实验一 } x2 = max_def(2,3,4); d1 = max_def(2.1,5.6); d2 = max_def(12.3,3.4,7.8);-----------------------------------------------------① cout<<\"x1=\"< 问题二:哪些情况可以参与函数的重载? 函数参数的类型不同,或者参数的个数不同,或者二者兼而有之。 问题三:①处调用的是哪个函数? 调用的是def(int x, int y, int z)这个函数。 问题四:②处的输出结果为什么是d2=12,而不是d2=12.3? 因为调用的是def(int x, int y, int z)这个函数,所以输出值为整型。 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include int main() { int *p1 = new int; -----------------------------------------------------① int *p2 = new int(0); -----------------------------------------------------② char *p3 = new char[64]; -----------------------------------------------------③ delete []p3; return 1; 4 C++面向对象程序设计实验指导书 实验一 } 问题一:①、②、③处动态申请内存分别代表什么不一样的意思? 1处代表new动态分配存放一个整数的内存空间,并将其首地址赋给指针变量p1. 2处代表new动态分配内空间,并将0作为初始值赋给首地址p2。 3处代表new动态分配存放数组的内存空间,并将首地址赋给指针变量p3. 问题二:该程序存在什么隐患?改正该程序使隐患消除。 没有释放动态分配的数组存储空间,同意导致没有足够的内存满足分配要求,导致动态分配空间失败。 3.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include void swap(int a, int b) { int temp = a; a = b; b = temp; } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int i = 5; int j = 10; cout<<\"Before swap: i=\"<swap(i,j); -----------------------------------------------------① cout<<\"After the first swap: i=\"<swap(&i,&j); -----------------------------------------------------② cout<<\"After the second swap: i=\"<return 1; } 问题一:上述程序的输出结果是什么? 5 C++面向对象程序设计实验指导书 实验一 问题二:①处函数调用后并不能实现两个数的交换,而②处却可以,为什么? 因为1处调用的函数是void swap(int a, int b),i、j将值传给a、b后,a、b值的交换与i、 j无关所以不能实现两个数的交换。2处调用的函数是void swap(int *a, int *b),将i、j地址传给*a、*b,*a、*b交换数值即交换i、j地址,所以i、j值交换了。 问题三:②处调用的是哪个重载函数? 调用void swap(int *a, int *b) 这个函数。 1.2.2 程序设计 1.使用函数重载的方法定义两个重名函数,分别求出整形数平面间两点间距离和双精度平面间两点间距离,如果没有输入第二点的坐标则默认为圆点(0,0)。 #include int fun_c(int i0,int j0,int i1,int j1) {return (i0-i1)*(i0-i1)+(j0-j1)*(j0-j1); } double fun_c(double x0,double y0,double x1,double y1) {return (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1); } int main() {int i0=1,i1=2,j0=3,j1=4;//(i0,j0) (i1,j1)分别为两个点 double x0=1.1,x1=2.2,y0=3.3,y1=4.4;//(x0,y0) (x1,y1)分别为两个点 cout<<\"距离为\"< 6 C++面向对象程序设计实验指导书 实验一 赋值给b,b的内容赋值给c,c的内容赋值给a,要求采用引用的方式来实现。 #include void exchange(float &x, float &y, float &z) { float temp = x; x=z; z=y; y = temp; } int main() { float a= 5; float b = 10; float c=15; cout<<\"Before exchange: a=\"<1.3 思考题 1.自己设计一个程序,测试const的三种用法:指向常量的指针,常指针,指向常量的常指针。 2.编写一个函数,实现两个字符串变量的交换,要求参数用引用。 7 C++面向对象程序设计实验指导书 实验二 实验二 类和对象—类的构建 2.1 实验目的 1.类的定义; 2.类对象的使用; 3.类成员变量的定义和使用; 4.类成员函数的定义和使用; 5.理解类的作用域; 6.理解类的声明; 7.理解类中private和public权限的声明依据。 2.2 实验内容 2.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include class CDate { void Set(int m, int d, int y ) { month = m ; day = d ; year = y ; } int IsLeapYear() { return (year%4 == 0 && year%100 != 0)||(year%400 == 0); } public: void Print() { cout< 8 C++面向对象程序设计实验指导书 实验二 void main() { CDate a; -----------------------------------------------------① a.Set(10,15,2007) ; a.Print(); } 问题一:以上程序编译能通过吗,为什么,应该如何改正? 问题二:类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限? 问题三:①处语句的意思是什么? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include int month;//全局变量 int day; int year; void Set(int m,int d,int y) -----------------------------------------------------a { ::month=m; -----------------------------------------------------① ::day=d; ::year=y; } class CDate { public: void Set(int m,int d,int y) -----------------------------------------------------b { ::Set(m,d,y); -----------------------------------------------------② } void Print() { cout< void main() { CDate a; a.Set(10,15,2007) ; a.Print(); 9 C++面向对象程序设计实验指导书 实验二 } 问题一:①处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符::,程序是否还能正确运行? 问题二:②处调用的哪个函数,如果去掉域作用符::,程序是否还能正确运行? 问题三:该程序的输出结果是什么,试解释该输出结果。 2.2.2 程序设计 1.试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。 2.3思考题 1.试指出以下程序的错误,并改正之。 #include class CPoint { public: unsigned x, unsigned y; bool IsInCircle(CCircle *Circle) { return (((x-Circle->Center.x)*(x-Circle->Center.x) +(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius); } }; class CCircle { public: unsigned Radius; CPoint Center; }; void main() { } 10 C++面向对象程序设计实验指导书 实验三 实验三 类和对象—构造函数与析构函数 3.1 实验目的 1.理解掌握this指针的作用和用法; 2.理解掌握构造函数的定义和作用; 3.掌握构造函数的使用; 4.理解掌握拷贝构造函数的定义和使用; 5.理解掌握构造函数的重载; 6.理解掌握析构函数的定义和使用。 3.2 实验内容 3.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include class CPoint { public: void Set(int x,int y); void Print(); private: int x; int y; }; void CPoint::Set(int x,int y) { x = x; y = y; } void CPoint::Print() { cout<<\"x=\"< 11 C++面向对象程序设计实验指导书 实验三 { } CPoint pt; pt.Set(10,20); pt.Print(); 问题一:以上程序编译能通过吗,试解释该程序? 问题二:以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include class CPerson { public: void Print(); private: CPerson(); private: int age; char *name; }; CPerson::CPerson() { } void CPerson::Print() { cout<<\"name=\"< CPerson ps(23,\"张三\"); ps.Print(); } 问题一:以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。 3.2.2 程序设计 1.设计实现一个CPoint类,满足以下要求: a. 该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0; c.可以采用直接输入参数的方式来初始化该类的成员变量; 12 C++面向对象程序设计实验指导书 实验三 d.可以采用其它的CPoint对象来初始化该类的成员变量; e.设计一个主函数来测试以上功能。 3.3思考题 1.设计一个CStudent(学生)类,并使CStudent类具有以下特点: a.该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩; b.学生全部信息由键盘输入,以提高程序的适应性; c.通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩; d.输出学生的基本信息、各科成绩与平均成绩; e.学生对象的定义采用对象数组实现; f.统计不及格学生人数。 13 C++面向对象程序设计实验指导书 实验四 实验四 类和对象—对象传递与静态成员 4.1 实验目的 1.理解静态成员(静态数据成员、静态成员函数)的作用与使用; 2.理解友元(友元函数、友元类)的作用于使用; 3.理解常类型的使用。 4.2 实验内容 4.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include class CStudent { public: CStudent(char *n, int a); ~CStudent(); static void SetAge(int age); private: char *name; int age; static int nTotalObj; }; int CStudent::nTotalObj = 0; CStudent::CStudent(char *n, int a) :age(a) { int nLen = strlen(n); name = new char[nLen+1]; strcpy(name,n); name[nLen] = '\\0'; 14 C++面向对象程序设计实验指导书 实验四 nTotalObj++; } CStudent::~CStudent() { delete[] name; nTotalObj--; } void CStudent::SetAge(int age) { this->age = age; } void main() { CStudent stu1(\"张三\",25); CStudent str2(\"李四\",26); cout<<\"CStudent::nTotalObj=\"< 问题二:成员变量nTotalObj在程序中起什么作用,它是如何实现的? 问题三:如果规定该程序的主函数和类CStudent中的成员变量的属性不允许改变,应该如何改正该程序? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include class CStudent { public: CStudent(char *n, int a); ~CStudent(); private: char *name; int age; }; CStudent::CStudent(char *n, int a) :age(a) { int nLen = strlen(n); name = new char[nLen+1]; 15 C++面向对象程序设计实验指导书 实验四 strcpy(name,n); name[nLen] = '\\0'; } CStudent::~CStudent() { delete[] name; } class CTeacher { public: CTeacher(char *tn, int ta); ~CTeacher(); void SetStuAge(int a); private: char *name; int age; CStudent stu; }; CTeacher::CTeacher(char *tn, int ta) :age(ta) { int nLen = strlen(tn); name = new char[nLen+1]; strcpy(name,tn); name[nLen] = '\\0'; } CTeacher::~CTeacher() { delete[] name; } void CTeacher::SetStuAge(int a) { stu.age = a; } void main() { CStudent stu(\"张三\",25); CTeacher tea(\"李四\",26); 16 C++面向对象程序设计实验指导书 实验四 } 问题一:以上程序有两大错误,试指出来,并改正之? 3.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \"iostream.h\" class Date { private: const int year; const int month; const int day; public: Date(int y,int m,int d); void showdate(); }; Date::Date(int y,int m,int d) { year = y; month = m; day = d; } void Date::showdate() { cout< const Date obj(2007,10,30); obj.showdate(); } 问题一:以上程序有两大错误,试指出来,并改正之(要求主函数和类Date的数据成员属性不可以改动)? 4.2.2 程序设计 1.某商店经销一种货物。货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记录下目录库存的总重量。试用C++模拟商店货物购进和卖出的情况。 17 C++面向对象程序设计实验指导书 实验五 实验五 派生与继承—单重派生 5.1 实验目的 1.理解继承的含义以及声明; 2.理解共有派生、私有派生和保护派生的含义以及使用; 3.理解单派生类中构造函数和析构函数的调用顺序。 5.2 实验内容 5.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \"iostream.h\" class CBase { public: CBase(int a) :a(a) { } protected: void print() { cout<<\"a=\"<class CDerive : public CBase { public: void print() { CBase::print(); cout<<\"b=\"<18 C++面向对象程序设计实验指导书 实验五 int b; }; void main() { CDerive d; d.print(); CBase b; b.print(); } 问题一:以上程序有两大错误,试指出来,并改正之? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \"iostream.h\" class CBase { public: CBase(int a) :a(a) { cout<<\"base structure\"< public: