C++面向对象程序设计实验指导书

更新时间:2024-05-01 06:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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++面向对象程序设计实验指导书 实验四

实验四 类和对象—对象传递与静态成员

4.1 实验目的

1.理解静态成员(静态数据成员、静态成员函数)的作用与使用; 2.理解友元(友元函数、友元类)的作用于使用; 3.理解常类型的使用。

4.2 实验内容 4.2.1程序阅读

1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。

#include #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 #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 #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 #include

//容错处理

enum ErrorType {

invalidArraySize,memoryAllocatetionError,indexOutOfRang };

char *errorMsg[] = {

\,

\, \ };

template class Array {

private:

T* alist; int size;

void Error(ErrorType error) const;//输出错误信息 public:

Array(int sz=50);//构造函数

30

C++面向对象程序设计实验指导书 实验九

Array(const Array& X);//拷贝构造函数 ~Array(void);//析构函数

Array& operator=(const Array& rhs);//重载赋值运算符 T& operator[](int i);//重载下标运算符 int GetSize(void) const;//获取数组大小 void Resize(int sz);//重新设置数组大小 };

template

Array::Array(int sz) {

if(sz <= 0) Error(invalidArraySize); size = sz;

alist = new T[size]; if(alist == 0) Error(memoryAllocatetionError); }

template

Array::Array(const Array& X) {

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 Array::~Array() {

delete[] alist; }

template

Array& Array::operator=(const Array &rhs) {

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::operator[](int n) {

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

本文来源:https://www.bwwdw.com/article/z1qg.html

Top