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 程序设计 ................................................................................................................. 5 1.3 思考题 ................................................................................................................................ 5 实验二 类和对象—类的构建 ......................................................................................................... 6
2.1 实验目的 ............................................................................................................................ 6 2.2 实验内容 ............................................................................................................................ 6
2.2.1程序阅读 .................................................................................................................. 6 2.2.2 程序设计 ................................................................................................................. 8 2.3思考题 ................................................................................................................................. 8 实验三 类和对象—构造函数与析构函数 ..................................................................................... 9
3.1 实验目的 ............................................................................................................................ 9 3.2 实验内容 ............................................................................................................................ 9
3.2.1程序阅读 .................................................................................................................. 9 3.2.2 程序设计 ............................................................................................................... 10 3.3思考题 ............................................................................................................................... 11 实验四 类和对象—对象传递与静态成员 ................................................................................... 12
4.1 实验目的 .......................................................................................................................... 12 4.2 实验内容 .......................................................................................................................... 12
4.2.1程序阅读 ................................................................................................................ 12 4.2.2 程序设计 ............................................................................................................... 15
实验五 派生与继承—单重派生 ................................................................................................... 16
5.1 实验目的 .......................................................................................................................... 16 5.2 实验内容 .......................................................................................................................... 16
5.2.1程序阅读 ................................................................................................................ 16 5.2.2 程序设计 ............................................................................................................... 18
实验六 派生与继承—多重派生 ................................................................................................... 19
6.1 实验目的 .......................................................................................................................... 19 6.2 实验内容 .......................................................................................................................... 19
6.2.1程序阅读 ................................................................................................................ 19 6.2.2 程序设计 ............................................................................................................... 22 6.3思考题 ............................................................................................................................... 22 实验七 多态性—函数与运算符重载 ........................................................................................... 23
7.1 实验目的 .......................................................................................................................... 23 7.2 实验内容 .......................................................................................................................... 23
7.2.1程序阅读 ................................................................................................................ 23
I
C++面向对象程序设计实验指导书 目录
7.2.2 程序设计 ............................................................................................................... 25 7.3思考题 ............................................................................................................................... 26 实验八 多态性—类型转换与虚函数 ........................................................................................... 27
8.1 实验目的 .......................................................................................................................... 27 8.2 实验内容 .......................................................................................................................... 27
8.2.1程序阅读 ................................................................................................................ 27 8.2.2 程序设计 ............................................................................................................... 29 8.3思考题 ............................................................................................................................... 29 实验九 模板类的构造 ................................................................................................................... 30
9.1 实验目的 .......................................................................................................................... 30 9.2 实验内容 .......................................................................................................................... 30
9.2.1程序阅读 ................................................................................................................ 30 9.2.2 程序设计 ............................................................................................................... 32 9.3思考题 ............................................................................................................................... 32 实验十 C++的I/O流类库 ............................................................................................................ 33
10.1 实验目的 ........................................................................................................................ 33 10.2 实验内容 ........................................................................................................................ 33
10.2.1程序阅读 .............................................................................................................. 33 10.2.2 程序设计 ............................................................................................................. 34 10.3思考题 ............................................................................................................................. 34 实验十一 C++程序、Windows程序和MFC程序 ..................................................................... 36
11.1 实验目的 ........................................................................................................................ 36 11.2 实验内容 ........................................................................................................................ 36
11.2.1 实验描述 ............................................................................................................. 36 11.2.2 实验步骤 ............................................................................................................. 37 11.2.3 实验结果分析 ..................................................................................................... 43 11.3思考题 ............................................................................................................................. 45 实验十二 简单单文档MFC程序设计 .................................................................................. 46
12.1 实验目的 ........................................................................................................................ 46 12.2 实验内容 ........................................................................................................................ 46
12.2.1 实验描述 ............................................................................................................. 46 12.2.2 实验步骤 ............................................................................................................. 47 12.2.3 实验结果 ............................................................................................................. 52 12.3思考题 ............................................................................................................................. 53 实验十三 简单对话框程序设计 ............................................................................................. 54
13.1 实验目的 ........................................................................................................................ 54 13.2 实验内容 ........................................................................................................................ 54
13.2.1 实验描述 ............................................................................................................. 54 13.2.2 实验步骤 ............................................................................................................. 54 13.2.3 实验结果 ............................................................................................................. 61 13.3思考题 ............................................................................................................................. 61 实验十四 简单数据库程序设计 ............................................................................................. 63
14.1 实验目的 ........................................................................................................................ 63 14.2 实验内容 ........................................................................................................................ 63
II
C++面向对象程序设计实验指导书 目录
14.2.1 实验描述 ............................................................................................................. 63 14.2.2 实验步骤 ............................................................................................................. 64 14.2.3 实验结果 ............................................................................................................. 71 14.3思考题 ............................................................................................................................. 72 综合练习 ........................................................................................................................................ 73 总结 ................................................................................................................................................ 74 参考书目 ........................................................................................................................................ 75
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<<\< cout<<\< 问题一:上述程序的输出结果是什么? 问题二:哪些情况可以参与函数的重载? 问题三:①处调用的是哪个函数? 问题四:②处的输出结果为什么是d2=12,而不是d2=12.3? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include int main() { int *p1 = new int; -----------------------------------------------------① int *p2 = new int(0); -----------------------------------------------------② char *p3 = new char[64]; -----------------------------------------------------③ return 1; } 问题一:①、②、③处动态申请内存分别代表什么不一样的意思? 问题二:该程序存在什么隐患?改正该程序使隐患消除。 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() 4 C++面向对象程序设计实验指导书 实验一 { } int i = 5; int j = 10; cout<<\< swap(i,j); -----------------------------------------------------① cout<<\< swap(&i,&j); -----------------------------------------------------② cout<<\< return 1; 问题一:上述程序的输出结果是什么? 问题二:①处函数调用后并不能实现两个数的交换,而②处却可以,为什么? 问题三:②处调用的是哪个重载函数? 1.2.2 程序设计 1.使用函数重载的方法定义两个重名函数,分别求出整形数平面间两点间距离和双精度平面间两点间距离,如果没有输入第二点的坐标则默认为圆点(0,0)。 2.设计一个函数:exchange(float x, float y, float z),当调用exchange(a,b,c)时,将a的内容赋值给b,b的内容赋值给c,c的内容赋值给a,要求采用引用的方式来实现。 1.3 思考题 1.自己设计一个程序,测试const的三种用法:指向常量的指针,常指针,指向常量的常指针。 2.编写一个函数,实现两个字符串变量的交换,要求参数用引用。 5 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 && year0 != 0)||(year@0 == 0); } public: void Print() { cout< int month; int day; int year; }; 6 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< int month; //成员变量 int day; int year; }; void main() { CDate a; a.Set(10,15,2007) ; a.Print(); 7 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() { } 8 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<<\< void main() 9 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<<\< void main() { CPerson ps(23,\张三\); ps.Print(); } 问题一:以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。 3.2.2 程序设计 1.设计实现一个CPoint类,满足以下要求: a. 该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0; c.可以采用直接输入参数的方式来初始化该类的成员变量; 10 C++面向对象程序设计实验指导书 实验三 d.可以采用其它的CPoint对象来初始化该类的成员变量; e.设计一个主函数来测试以上功能。 3.3思考题 1.设计一个CStudent(学生)类,并使CStudent类具有以下特点: a.该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩; b.学生全部信息由键盘输入,以提高程序的适应性; c.通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩; d.输出学生的基本信息、各科成绩与平均成绩; e.学生对象的定义采用对象数组实现; f.统计不及格学生人数。 11 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'; 12 C++面向对象程序设计实验指导书 实验四 nTotalObj++; } CStudent::~CStudent() { delete[] name; nTotalObj--; } void CStudent::SetAge(int age) { this->age = age; } void main() { CStudent stu1(\张三\,25); CStudent str2(\李四\,26); cout<<\< 问题一:以上程序编译能通过吗,为什么? 问题二:成员变量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]; 13 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); 14 C++面向对象程序设计实验指导书 实验四 } 问题一:以上程序有两大错误,试指出来,并改正之? 3.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \ 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< void main() { const Date obj(2007,10,30); obj.showdate(); } 问题一:以上程序有两大错误,试指出来,并改正之(要求主函数和类Date的数据成员属性不可以改动)? 4.2.2 程序设计 1.某商店经销一种货物。货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记录下目录库存的总重量。试用C++模拟商店货物购进和卖出的情况。 15 C++面向对象程序设计实验指导书 实验五 实验五 派生与继承—单重派生 5.1 实验目的 1.理解继承的含义以及声明; 2.理解共有派生、私有派生和保护派生的含义以及使用; 3.理解单派生类中构造函数和析构函数的调用顺序。 5.2 实验内容 5.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \ class CBase { public: CBase(int a) :a(a) { } protected: void print() { cout<<\< class CDerive : public CBase { public: void print() { CBase::print(); cout<<\< 16 C++面向对象程序设计实验指导书 实验五 int b; }; void main() { CDerive d; d.print(); CBase b; b.print(); } 问题一:以上程序有两大错误,试指出来,并改正之? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \ class CBase { public: CBase(int a) :a(a) { cout<<\< ~CBase() { cout<<\< void print() { cout<<\< class CDerive : public CBase { public: CDerive(int a, int b,int c) :CBase(a),b(b),c(c) { cout<<\< ~CDerive() { cout<<\< 17 C++面向对象程序设计实验指导书 实验五 } void print() { CBase::print(); cout<<\< CBase b; int c; }; void main() { CDerive d(1,2,3); -----------------------------------------------------① d.print(); } 问题一:以上程序的输出结果是什么,说明为什么? 问题二:①处语句执行完后,d.b.a的值为多少? 5.2.2 程序设计 1.定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点: a.CLine类含有计算直线长度和斜率的成员函数; b.CCircle类含有计算圆面积的成员函数。 18 C++面向对象程序设计实验指导书 实验六 实验六 派生与继承—多重派生 6.1 实验目的 1.理解多重派生的定义; 2.理解多重派生中构造函数与析构函数的调用顺序; 3.理解多重派生中虚拟基类的作用; 6.2 实验内容 6.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 class CBase1 { public: CBase1(int a) :a(a) { cout<<\< ~CBase1() { cout<<\< void print() { cout<<\< class CBase2 { public: CBase2(int b) :b(b) { cout<<\< 19 C++面向对象程序设计实验指导书 实验六 } ~CBase2() { cout<<\< void print() { cout<<\< class CDerive : public CBase1, public CBase2 { public: CDerive() { cout<<\< ~CDerive() { cout<<\< void print() { CBase1::print(); CBase2::print(); b1.print(); b2.print(); cout<<\< CBase1 b1; CBase2 b2; int c; }; void main() { CDerive d; d.print(); } 问题一:改正以上程序中存在的错误,并分析该程序的输出结果。 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 20 C++面向对象程序设计实验指导书 实验六 #include \ class CBase { public: CBase(int a) :a(a) { } int a; }; class CDerive1 : public CBase { public: CDerive1(int a) :CBase(a) { } }; class CDerive2 : public CBase { public: CDerive2(int a) :CBase(a) { } }; class CDerive : public CDerive1,public CDerive2 { public: CDerive(int a,int b) :CDerive1(a),CDerive2(b) { } }; void main() { CDerive d(1,2); cout< 问题一:在不改变原有程序意图的前提下,分别用三种方法改正以上程序,并使程序正确输出。 21 C++面向对象程序设计实验指导书 实验六 6.2.2 程序设计 1.建立普通的基类building,用来存储一座楼房的层数、房间数以及它的总平方数。建立派生类house,继承building,并存储卧室与浴室的数量,另外,建立派生类office,继承building,并存储灭火器与电话的数目。设计一主函数来测试以上类的用法。 6.3思考题 1.按照下图的类层次结构编写程序,定义属于score的对c1以及类teacher的对象t1,分别输入个数据成员的值后再显示出这些数据。 personnameidstudaddrtelteacherdegreedepstudentoldsnomathengscore 22 C++面向对象程序设计实验指导书 实验七 实验七 多态性—函数与运算符重载 7.1 实验目的 1.理解动态联编和动态联编的概念; 2.理解掌握成员函数方式运算符重载; 3.理解掌握友元函数方式运算符重载; 4.理解掌握++、--、=运算符的重载。 7.2 实验内容 7.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \ class CComplex { public: CComplex() { real = 0; imag = 0; } CComplex(int x,int y) { real = x; imag = y; } int real; int imag; CComplex operator + (CComplex obj1)-----------------------------------------------① { CComplex obj2(real + obj1.real, imag + obj1.imag); return obj2; } }; 23 C++面向对象程序设计实验指导书 实验七 void main() { CComplex obj1(100,30); CComplex obj2(20, 30); CComplex obj; obj = obj1+obj2; ------------------------------------------------------------------② cout << obj.real < 问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型? 问题二:②处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数? 2.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include \ class CComplex { public: CComplex() { real = 0.0; imag = 0.0; } CComplex(float x, float y) { real = x; imag = y; } CComplex operator + (CComplex &obj1, CComplex &obj2) { CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag); return obj3; } CComplex &operator++(CComplex &obj) { obj.real += 1; obj.imag +=1; return obj; } void print() { cout< 24 C++面向对象程序设计实验指导书 实验七 private: float real; float imag; }; CComplex &operator--(CComplex &x) { x.real -= 1; x.imag -= 1; return x; } void main() { CComplex obj1(2.1,3.2); CComplex obj2(3.6,2.5); cout<<\; obj1.print(); cout<<\; obj2.print(); CComplex obj3 = obj1 + obj2; cout<<\; obj3.print(); ++obj3; cout<<\; obj3.print(); --obj3; cout<<\; obj3.print(); CComplex obj4 = ++obj3; cout<<\; obj4.print(); } 问题一:以上程序中的三个运算符重载都有错误,试改正过来,并分析该程序的输出结果。 7.2.2 程序设计 1.把7.2.1中第一道题的程序改造成采取友元函数重载方式来实现“+”运算符,并采取友元函数重载方式增加前置和后置“++”以及“--”运算符重载,并设计主函数来验证重载运算符的用法。 25 C++面向对象程序设计实验指导书 实验七 7.3思考题 1.定义CPoint类,有两个成员变量:横坐标(x)和纵坐标(y),对CPoint类重载“++”(自增运算符)、“--”(自减运算符),实现对坐标值的改变。(每个函数均采用友元禾成员函数实现) 26 C++面向对象程序设计实验指导书 实验八 实验八 多态性—类型转换与虚函数 8.1 实验目的 1.理解掌握运算符[]、()的重载; 2.理解类型转换,掌握类型转换函数的设计和使用; 3.理解和掌握虚函数的作用; 4.掌握利用虚函数实现C++的运行时多态性; 5.理解纯虚类和抽象类。 8.2 实验内容 8.2.1程序阅读 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include class CComplex { public: CComplex(double r = 0, double i = 0) { real = r; imag = i; } int operator int() { return (int)real; } void Display(void) { cout << \ << real << \ << imag << \ << endl; } protected: double real; double imag; }; 27 C++面向对象程序设计实验指导书 实验八 class CVector { public: CVector(CComplex &obj1, CComplex &obj2, CComplex &obj3, CComplex &obj4) { objArray[0] = obj1; objArray[1] = obj2; objArray[2] = obj3; objArray[3] = obj4; } friend CComplex &operator[](CVector obj, int n); private: CComplex objArray[4]; }; CComplex &operator[](CVector obj, int n) { if(n<0 || n>3) { cout<<\< return obj.objArray[n]; } void main() { CComplex c1(1.1, 1.1); CComplex c2(2.2, 2.2); CComplex c3(3.3, 3.3); CComplex c4(4.4, 4.4); CVector v(c1,c2,c3,c4); v[0].Display(); v[1].Display(); v[2].Display(); v[3].Display(); v[0] = 5.5; ----------------------------------------------------------① v[1] = CComplex(6.6); -------------------------------------------② v[2] = int(CComplex(7.7)); --------------------------------------③ v[3] = int(CComplex(8.8,9.9)); ----------------------------------④ 28 C++面向对象程序设计实验指导书 实验八 } v[0].Display(); v[1].Display(); v[2].Display(); v[3].Display(); 问题一:上述程序存在两大错误,在不修改主函数和程序原意的前提下,改正该程序中存在的错误。 问题二:①处的转换属于显式转换还是隐式转换,并解释该转换过程。 问题三:②处的转换属于显式转换还是隐式转换,并解释该转换过程。 问题四:解释③处的转换过程。 问题五:解释④处的转换过程。 8.2.2 程序设计 1.编写一个程序计算三角形、正方形和圆形的面积,要求抽象出一个基类base,在其中说明一个虚函数,用来求面积,并利用单接口,多实现版本设计各图形面积的方法。 8.3思考题 1.设计一个汽车类Motor,该类具有可载人数、轮胎数、马力数、生产厂家和车主五个数据成员,根据Motor类派生出Car类、Bus类和Truck类。其中Bus类除继承基类的数据成员外,还具有表示车厢节数的数据成员Number;Truck类除继承基类的数据成员之外,还具有表示载重量的数据成员Weight。每个类都具有成员函数Display,用于输出各类对象的相关信息。要求设计一个统一的显示相关信息的全局函数ShowInfo在主函数种调用,主函数中不直接调用类里面的Display函数。 29 C++面向对象程序设计实验指导书 实验九 实验九 模板类的构造 9.1 实验目的 1.理解和应用类模板和函数模板; 2.复习数据结构的相关知识; 3.学习用C++的编程思想实现链表类。 9.2 实验内容 9.2.1程序阅读 1.理解下面的动态数组类模板,它由一系列位置连续、任意数量相同类型的元素组成,其元素个数可在程序运行时改变,并完成该类中没有完成的成员函数(不允许改变已有代码),并设计主函数,实现对该模板类的功能测试。 #include //容错处理 enum ErrorType { invalidArraySize,memoryAllocatetionError,indexOutOfRang }; char *errorMsg[] = { \, \, \ }; template private: T* alist; int size; void Error(ErrorType error) const;//输出错误信息 public: Array(int sz=50);//构造函数 30 C++面向对象程序设计实验指导书 实验九 Array(const Array Array template Array if(sz <= 0) Error(invalidArraySize); size = sz; alist = new T[size]; if(alist == 0) Error(memoryAllocatetionError); } template Array int n = X.size; size = n; alist = new T[n]; if(alist == 0) Error(memoryAllocatetionError); T* srcptr = X.alist; T* destptr = alist; while(n--) *destptr++ = *srcptr++; } template delete[] alist; } template Array int n = rhs.size; if(size != n) { 31 C++面向对象程序设计实验指导书 实验九 delete[] alist; alist = new T[n]; if(alist == 0) Error(memoryAllocatetionError); size = n; } T* destptr = alist; T* srcptr = rhs.alist; while(n--) *destptr++ = *srcptr++; return *this; } template T& Array if(n < 0 || n > size-1) Error(indexOutOfRang); return alist[n]; } void main() { } 9.2.2 程序设计 1.设计一个通用链表类,要求如下: a.数据成员包含头指针、尾指针、链表中节点个数、顺序访问中当前节点指针和当前节点前一个节点的指针; b.主要的成员函数包含:生成节点(在链表头、尾以及任意位置)、插入节点、删除节点、访问/修改节点、遍历链表,以及一些辅助函数等; c.能实现两个链表的复制; d.能实现两个链表对象的赋值; e.在测试程序中定义两个整型链表A和B,本别插入5个元素,然后把B中的元素加入A的尾部。 9.3思考题 1.根据数据结构和类模板知识,定义一个通用队列(先进先出)类并加以实现,编写主函数进行测试; 2.根据数据结构和类模板知识,定义一个通用栈(后进先出)类并加以实现,编写主函数进行测试。 32 C++面向对象程序设计实验指导书 实验十 实验十 C++的I/O流类库 10.1 实验目的 1.理解C++输入输出流类库; 2.掌握ios类中用于控制输入输出成员函数的使用; 3.掌握操纵符格式控制的使用; 4.掌握用户自定义数据类型的输入输出方式; 5.掌握文本文件和二进制文件的输入输出; 6.将C++输入输出流灵活应用到类和对象知识中。 10.2 实验内容 10.2.1程序阅读 1.阅读下列程序,然后上机运行验证输出结果,并回答下列问题。 #include \ void showflags(long f) { long i = 0x8000; for(; i; i=i>>1) { if(i&f) cout<<\; else cout<<\; } cout< void main() { showflags(cout.flags()); cout<<\< cout<<\< 33 C++面向对象程序设计实验指导书 实验十 } cout<<\< cout<<123<<\ \<<123.45678<<\ \<<234.567< cout<<\< cout<<\< cout<<123<<\ \<<123.45678< cout<<123<<\ \<<123.45678< cout<<\< showflags(cout.flags());----------------------------------------------------------② cout.setf(ios::right|ios::unitbuf); showflags(cout.flags());----------------------------------------------------------③ 问题一:①处的输出结果是什么,为什么? 问题二:②处的输出结果是什么,为什么? 问题三:③处的输出结果是什么,为什么? (提示:在x_flags变量中left=0x0002,right=0x0004,unitbuf=0x2000) 10.2.2 程序设计 1.采用预定义的输入输出操纵符格式控制改造10.2.1中第一题,使其达到相同的输出效果。 2.定义一复数类CComplex(类中含有实部real和虚部imag私有成员变量,都为double类型),重载输入运算符>>和输出运算符<<,使得该类可以直接通过输入输出运算符进行输入输出操作。 3.有一名为test.txt的文件,里面分两行分别存储了整数12345678和字符串abcdefg,设计两个完整的程序,第一个程序以文本文件的方式存取该文件,第二个程序以二进制的方式存取该文件,并比较以这两种方式存取该文件对文件本身有什么影响。 10.3思考题 1.设计一学生注册信息登记程序,该程序要求达到以下要求: a.学生信息包括姓名,学号,性别; b.学生信息要求能够循环从键盘输入,如果输入0 0 0,则退出输入; c.将所有输入的学生信息按文本文件的方式存储到一名为stureginfo.txt的文件中,文件中 34 C++面向对象程序设计实验指导书 实验十 存储信息的格式如下: 姓名:张三 学号:10521030146 性别:男 d.停止输入后,程序读出存储到stureginfo.txt文件中的所有信息,并显示在屏幕上。 35 C++面向对象程序设计实验指导书 实验十一 实验十一 C++程序、Windows程序和MFC 程序 11.1 实验目的 1.理解C++程序、Windows程序以及MFC程序之间的联系与区别; 2.理解Windows程序的消息机制; 3.学会应用VC++6.0的AppWizard创建基于MFC的Windows程序; 4.理解C++在MFC中的位置和作用。 11.2 实验内容 11.2.1 实验描述 1.理解C++程序、Windows程序和MFC程序的联系与区别 C++是面向对象编程语言中的一种,它具有封装性、继承性以及多态性三大特性,用C++语言写出来的程序需要借助编译器才能生成可执行的二进制代码,VC++6.0中具有能识别C++程序的编译器,所以VC++6.0可以用来作为C++程序的开发环境。 MFC(Microsoft Foundation Class)是微软公司开发出来的一套用于Windows程序开发的类库,MFC是建立在C++语言基础之上的,它利用C++语言的三大特性对自己进行了封装,极大地方便了用户在Windows上进行程序开发,同时MFC也借助AppWizard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。 Windows程序与其他程序最大的不同之处在于使用消息机制,在Windows程序中所发生的一切都可以用消息表示,消息用于告诉操作系统所发生的事情。在MFC中遵循Windows的消息机制,MFC对消息的处理利用了消息映射的方法,所谓消息映射就是将消息与处理函数相联系,即当系统产生一条消息时,它能找到处理该消息的函数,该方法的基础是宏定义实现。 2.Windows系统是一个消息驱动的OS,可以从以下几个方面来理解Windows的消息机制: ? 消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。 当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单选中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 ? 谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对 消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 36 C++面向对象程序设计实验指导书 实验十一 ? 未处理的消息到那里去了:Windows系统为窗口编写了默认的窗口过程,这个窗口过程 将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不用处理,而是让系统自己去做默认处理。 ? 窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识 一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时,消息就会通过窗口一的句柄被发送到窗口过程代码中。 ? Windows系统的消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被 放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。 3.本次实验将利用MFC的应用程序向导(AppWizard)生成一个支持MFC的Windows程序,同时在生成应用程序的过程中理解不同设置对工程的影响。 11.2.2 实验步骤 1.启动VC++6.0开发环境,选择File|New菜单项,弹出如图11-1对话框。 图11-1 2.选择MFC AppWizard[exe],在Location文本编辑框中输入文件欲保存的目录位置,或单击省略号“...”按钮选择已有的目录;同时在Project name下面的文本编辑框中输入工程名称,本次实验我们的工程名称为MyTestProject,这时OK按钮被激活。该对话框中还有以下选项:(如图11-1) ? Create new workspace单选按钮:表示创建一个新的工作区,并将新项目添加到这个工 37 C++面向对象程序设计实验指导书 实验十一 作区。 ? Add current workspace单选按钮:表示将项目添加到当前工作区,如果此时有多个工作 区,那么可以通过选中Dependency of复选按钮来选择当前项目需要添加到的工作区。 2.单击OK按钮,进入如图11-2所示的MFC AppWizard - Step 1对话框,该对话框主要有以下选项: ? What type of application would you like to current?你想要创建的应用程序有以下单选项 供选择: ? Single document:生成单文档应用程序。 ? Multiple document:生成多文档应用程序。 ? Dialog based:生成基于对话框的应用程序(如计算器等)。 ? Document/View architecture support?是否需要支持文档/视图结构,需要则选中该选项, 如果不需要,则应用程序中关于文件的打开、关闭、保存及文档/视图的相互作用等功能需要程序员自己实现。 ? What language would you like your resources in?选择生成何种语言界面的应用程序,如 果需要中文界面,则选择如图11-2中的“中文[中国]”,本例中选择生成单文档的应用程序。 图11-2 3.单击Next按钮进入MFC AppWizard – Step 2 of 6对话框,如图11-3所示,该对话框用于支持数据库功能选项的选择,本例中选择None,下面分别为该对话框中的主要选项做一个简单介绍: ? What database support would you like to include?有四个单选项供选择: ? None:不支持数据库。 ? Header files only:只生成头文件。 38 C++面向对象程序设计实验指导书 实验十一 ? Database view without file support:没有文件支持的数据库视图。 ? Database view with file support:具有文件支持的数据库视图。 ? If you include a database view, you must select data source:若选择具有数据库视图,则必 须选择一个数据源。 ? Data Source按钮,单击它,则打开如图11-4所示的Database Option对话框,用于进行 数据库的选择,主要有以下选项: ? Datasource:数据源区域,有以下单选项: ? ODBC:指定数据源是ODBC数据库。 ? DAO:指定数据源是DAO数据库。 ? OLE DB:指定应用与OLE DB 数据源连接。 ? Recordset type:记录集类型区域,有以下单选项: ? Snapshot:指定记录集为快照。 ? Dynaset:指定记录集为动态记录集。 ? Table:指定记录集为一个表。 ? Advanced:高级选项,选中该选项可以指定m_bCheckCacheForDirtyFields为true, 为数据库创建一个数据缓冲区以检测数据。 图11-3 39 C++面向对象程序设计实验指导书 实验十一 图11-4 4.单击Next按钮进入MFC AppWizard – Step 3 of 6对话框,该对话框用于选择OLE选项的复合文档,本例中不使用OLE特性,故采用默认设置None,并取消对ActiveX Controls的选择。如图11-5所示: 图11-5 5.单击Next按钮进入MFC AppWizard – Step 4 of 6对话框(如图11-6所示),该对话框用于选择应用程序图形界面的外观,如工具栏、状态栏以及打印预览功能、使用3D控制外观 40 C++面向对象程序设计实验指导书 实验十一 和在线帮助等。本例中采用默认的设置,下面对各选项的功能作一个简单描述: ? Docking toolbar:为应用程序创建工具栏 ? Initial status bar:为应用程序创建状态栏 ? Printing and print preview:使应用程序具有打印与预览功能 ? Context-sensitive Help:具有支持上下文帮助的帮助文件 ? 3D controls:使应用程序具有三维效果 ? MAP[Messaging API]:使应用程序能够创建、操作、和存储邮件信息 ? Windows Sockets:支持基于TCP/IP的网络通信 ? Normal:普通外观 ? Internet Explore ReBars:与IE相似的外观 图11-6 6.单击Next进入MFC AppWizard – Step 5 of 6对话框(如图11-7所示),该对话框用于设置以下三方面的内容: ? What style of project would you like?应用程序的主窗口是MFC风格还是窗口左边具有切 分窗口的浏览器风格 ? Would you like to generate source file comments?在源文件是否加入注释以帮助用户编写 程序代码 ? How would you like to use the MFC library?使用动态链接库还是静态链接库 本例中选择As a statically linked library选项,其它接受默认设置。 41 C++面向对象程序设计实验指导书 实验十一 图11-7 7.单击Next按钮进入MFC AppWizard – Step 6 of 6对话框(如图11-8所示),该对话框用于对默认类名、基类名、各类文件名进行修改。如果选用CEditView类作为基类,这样生成的视图类将自动与文档类互相配合,其功能可以与Notepad相比,本例采用默认设置。 图11-8 42 C++面向对象程序设计实验指导书 实验十一 8.单击Finish按钮,生成如图11-9所示的New Project Information信息框,在该框信息框中列出了将要创建的应用程序的相关信息。单击OK按钮,完成应用程序的创建,若不满意,可以单击Cancel按钮,返回前面步骤进行修改。 图11-9 9.完成应用程序创建后,可以通过选择Build->Build MyTestProject.exe来完成对该工程的编译、链接工作,编译链接完成后,输出窗口中会输出警告信息和错误信息。 10.最后可以通过选择Build->Execute MyTestProject.exe(或Ctrl + F5)来运行该应用程序,如果前面的设置正确,并且VC++6.0开发环境安装正确,那该程序就可以正确运行。 11.2.3 实验结果分析 1.运行以上生成的应用程序后,就可以看到如图11-10所示的应用程序界面,该界面具有Windows应用程序的大部分特点(如窗口界面,菜单,工具栏以及状态栏等),但是该程序只是一个框架,并不能真正完成用户需要的工作,而我们要做的就是在这个已有的框架的基础上添加自己的代码来完成相关的工作。 43 C++面向对象程序设计实验指导书 实验十一 图11-10 2.VC++6.0以三种方式来组织文件(如图11-11):ClassView、ResourceView和FileView,其中ResourceView用来管理应用程序中用到的所有资源(包括对话框、位图、图表、菜单、工具栏等);ClassView和FileView管理着相同的文件,其中ClassView以类为单位查看文件,FileView以文件名为单位查看文件,这两者之间的联系就在于:VC++6.0中所有的类声明和类定义都是分开来的,其中类声明存放在头文件(文件后缀名为.h)中,类的定义存放在源文件(文件后缀名为.cpp)中。通过双击FileView中的文件可以在工作空间中显示相应文件的内容,通过双击ClassView中的类名称或类下面的成员变量可以在工作空间中显示对应类声明的头文件,通过双击ClassView中类下面的成函数可以在工作空间中显示对应类声明的源文件。 项目区 工作空间 VC++6.0组织文件的三种方式 图11-11 44 C++面向对象程序设计实验指导书 实验十一 11.3思考题 1.本实验的工程中一共生成了多少个类,它们的基类分别是什么,这些类的信息分别存储在哪些文件中? 2.本实验的工程中有一个名为CMainFrame的类,请问该类中有哪些成员函数和成员变量,成员变量中哪些属于类对象? 3.试分析类CAboutDlg在本实验的工程中所起的作用。 45 C++面向对象程序设计实验指导书 实验十二 实验十二 简单单文档MFC程序设计 12.1 实验目的 1.学会利用AppWizard生成单文档工程; 2.理解单文档工程中类的组织结构及其作用; 3.初步了解MFC的文档/视图结构; 4.初步理解键盘消息的相应; 5.初步理解和学会菜单消息的添加。 12.2 实验内容 12.2.1 实验描述 1.MFC中的消息种类 MFC中的消息可以分为Windows消息、控件通知消息、定时消息和命令消息等。 ? Windows消息:通常指以WM开头的消息,但是WM_COMMAND除外,键盘消 息和鼠标消息都是属于Windows消息,由窗口和视图进行处理。Windows消息通常带有若干个参数传递给消息处理函数,这些参数为处理函数正确地处理消息提供了充分的信息。 ? 控件通知消息:指当控件的状态发生改变时,控件向其父窗口发送的消息,MFC 将消息传递给相应的窗口处理。MFC对控件通知消息的传递方式与其它以WM开头的Windows消息一样,但是BN_CLICKED例外,该消息的传递方式与命令消息的传递机制相同。 ? 定时消息:当用户需要应用程序每隔一个指定的时间间隔便执行某一特定的操作 时,就需要用到定时消息WM_TIMER。 ? 命令消息:命令消息来自于用户界面对象的WM_COMMAND消息,这些用户界 面包括菜单、工具栏按钮和快捷键等。 2.MFC消息的映射机制 消息映射是指将消息与处理函数相联系,即当系统产生一条消息时,它能找到处理该消息的函数。VC++6.0提供了多种消息映射宏用于消息映射,如表12-1 表12-1 Visual C++常用消息映射宏 消息映射宏 BEGIN_MESSAGE_MAP END_MESSAGE_MAP ON_COMMAND ON_COMMAND_RANGE 功能 表示消息映射的开始,用于源文件中 表示消息映射结束,用于源文件中 将特定的命令消息映射到类的成员函数 将一组特定的命令消息映射到类的成员函数 DECLARE_MESSAGE_MAP 在头文件中使用,用于声明在源文件中存在消息映射 2.MFC中的文档/视图结构(document/view Architecture) 46