面向对象程序设计课程期末复习提要.docx
《面向对象程序设计课程期末复习提要.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计课程期末复习提要.docx(27页珍藏版)》请在冰豆网上搜索。
面向对象程序设计课程期末复习提要
《面向对象程序设计》课程期末复习提要
中央电大理工部计算机教研室
《面向对象程序设计》课程是中央电大计算机科学与技术专业(本科)一门必修的专业基础课。
该课程主要介绍如何用C++语言进行面向对象程序设计,因此C++语言的介绍是本书的重点,也是学员需要掌握的重点。
下面按照主教材内容次序给出具体复习要求,供同学们进行期末复习时参考。
各部分复习提要
第一部分程序设计基础
复习知识点:
C++程序的基本结构
基本数据类型
常量、变量的定义与使用
常用运算符的使用
表达式的分类和使用
简单的输入输出
复习要求:
1.理解:
C++程序的基本组成。
2.应用:
能够编写简单的程序,能完成简单数据类型数据输入、利用变量存放输入数据,利用常量存放固定数据,利用运算符进行简单的运算,并能够将结果输出(如书中2.6,2.7题)。
3.应用:
能进行比较复杂的表达式运算(如书中3.1,3.2,3.3题*)。
第二部分语句与操作流程
复习知识点:
语句的分类
分支语句
循环语句
转移语句
复习要求:
1.理解:
语句按功能分为:
操作运算语句和流程控制语句,其中操作运算语句按复杂程度分为简单语句和复合语句。
2.应用:
能够根据程序要求选择合适的流程控制语句(如书中4.2,4.4,4.5题)。
3.应用:
能够用多种循环语句实现一种循环的程序要求(如书中4.1题)。
4.综合应用:
综合运用各种语句完成比较复杂的程序逻辑(如书中4.9题)。
第三部分函数
复习知识点:
模块化程序设计
函数的定义
函数的定义与函数原型
函数参数的类型与传递方式
全局变量和局部变量
函数调用机制
递归函数
函数重载
函数的默认参数
静态局部变量
复习要求:
1.理解:
模块化程序设计与函数的关系。
2.理解:
默认参数的含义与用法,能够在程序中正确使用默认参数。
3.理解:
全局变量、局部变量、静态变量的含义,能够在程序中正确选择使用静态、局部和全局变量。
4.应用:
将一些功能明确的代码封装在函数中(如书中5.1,5.2,5.3题)。
5.应用:
利用递归函数来简化程序设计(如书中5.7题)。
6.应用:
利用函数重载来优化程序设计(如书中5.8题)。
7.应用:
根据给定要求编制满足功能需求的函数(如书中5.6题)。
第四部分程序结构
复习知识点:
外部存储类型extern
静态存储类型static
标识符的作用域
标识符的可见性与生命期
头文件与多文件结构
编译预处理
复习要求:
1.理解:
标识符的作用域的含义,作用域与标识符的可见性之间的关系。
能够指出给定程序中标识符的作用范围,包括局部作用域、函数作用域、文件作用域(如书中5.7题)。
2.理解:
标识符的三种生命期:
静态、局部和动态生命期,能指出给定程序中标识符的生命期。
3.理解:
多文件结构,能在程序设计中合理利用多文件来进行模块划分。
能正确使用外部存储类型和静态存储类型(如书中6.1,6.2,6.3题)。
4.理解:
编译预处理的概念,能在程序中合理使用#include预处理指令,看懂#define,#if,#ifndef,#else,#undef,#elif等指令。
5.综合应用:
能综合运用头文件、外部变量、静态变量来组织多文件结构的程序(如书中6.3题)。
第五部分引申数据类型-数组、指针和引用
复习知识点:
数组的概念、定义、初始化
向函数传递数组
多维数组
指针的概念、定义、初始化
指针变量的空间申请和释放
&和*运算符的使用
字符指针与字符串操作
命令行参数
引用的定义、初始化
用引用向函数传递参数
引用返回值
复习要求:
1.理解:
数组、指针和引用各自的含义和适用场合。
能够在程序设计中根据需要选择合适的数据类型。
2.理解:
程序命令行参数的意义和定义方式,能够正确地使用命令行参数。
3.理解:
多维数组的含义和其元素在内存中的存放顺序,能够在程序中选择使用多维数组。
4.应用:
能编制数组元素排序的算法和矩阵运算的算法(如书中7.4.7.7题)。
5.应用:
能够编制字符串操作的程序(如书中8.5,8.6题),能够利用标准库函数中的字符串操作函数进行编程。
6.应用:
能够在程序中动态申请空间,并进行合适的指针操作(如书中8.9题)。
7.应用:
能够编制将引用作为函数参数和返回值的应用程序(如书中9.1,9.2,9.3题)。
8.综合应用:
在程序中综合应用数组、指针和引用。
第六部分复杂数据类型-结构与类
复习知识点:
结构的定义、初始化与使用
结构指针、结构数组
结构作为函数参数与返回值
用结构实现链表
类的定义
类与结构的区别和联系
类成员的访问控制
内联函数
对象的生成
类的作用域
类的构造函数与析构函数
静态数据成员和函数
友元
类、对象与面向对象程序设计
this指针
复习要求:
1.理解:
使用结构的场合、结构的概念、结构成员的访问方式,给结构赋值的方式、结构作为函数参数与返回值的方式,能够在程序中正确选择使用结构。
2.理解:
结构和指针、结构数组的使用方式,能在程序中熟练使用。
3.应用:
利用结构实现链表操作。
能够实现链表结构的定义、链表的创建、遍历操作(如书中10.3,10.4,10.5,10.6)。
4.理解:
类成员的访问控制带来的封装性。
能够在程序设计中根据具体情况选择使用合适的访问控制。
5.综合应用:
能够根据程序要求构造满足要求的类。
在构造过程中充分考虑构造函数和析构函数的使用、成员访问控制的运用、内联函数的运用、静态成员的选用(如书中12.1,12.2题)。
6.综合应用:
能够根据要求构造多个类完成程序要求的功能,多个类之间可以发生一定的关系,如一个类作为另一个类的成员、一个类使用另一个类的服务等(如书中12.3,12.4题)。
第七部分继承与多态性
复习知识点:
结构化程序设计和面向对象程序设计思想的不同
继承的含义
派生类的定义和使用
派生类的构造
单继承与多继承的概念
静态联编与动态联编的各自的含义和它们的区别
静态联编与函数重载
动态联编与虚函数
多态性
抽象类与纯虚函数
复习要求:
1.理解:
继承的含义和使用条件,继承对于面向对象程序设计的影响。
能够在程序设计中适时选择利用继承减少工作量,提高程序设计效率。
2.理解:
派生类构造过程中的类成员的访问控制(只要求掌握公有继承的访问控制),保护成员在类继承中的作用。
能够准确合理地确定类成员的访问控制特征。
3.理解:
静态联编和动态联编各自的含义。
在程序设计中能够正确地选择使用函数重载和虚函数。
4.应用:
能利用面向对象思想按给定要求构造类(如书中13.2题)。
5.应用:
能够根据给定要求构造类的继承层次,并完成一定的程序逻辑(如书中16.4,16.5,16.6题)。
6.综合应用:
能够综合利用继承、虚函数、动态联编等语言机制完成比较简单的面向对象程序设计(如16.7题)。
第八部分运算符重载
复习知识点:
运算符重载的含义与定义方式
运算符重载的必要性
引用在重载中的作用
友元重载运算符
成员运算符重载
复习要求:
1.理解:
运算符重载的必要性。
能够在程序设计中适当选择进行运算符重载。
2.理解:
引用在运算符重载中的作用。
引用作为参数和返回值的好处和用法。
3.应用:
能够根据所给要求为给定类定义运算符成员函数和非成员运算符函数。
在定义过程中注意引用的使用(如书中18.1~18.4题)。
第九部分文件输入输出
复习知识点:
C++的标准I/O流
istream,ostream,iostream的关系
fstream,ifstream,ofstream三者的关系以及它们与上面三者的关系
文件I/O流的使用
文件的打开、关闭、定位
文件的输入输出
重载插入和析取运算符
复习要求:
1.理解:
C++标准I/O流所包含的类以及预先定义的流对象。
能够在程序设计中熟练运用cin、cout流进行输入输出。
2.理解:
文件I/O流的作用和使用方式,能在程序设计中熟练运用文件流进行操作。
3.应用:
能够根据程序要求进行文件的打开、关闭、定位等操作,能够利用插入、析取以及各种成员函数进行文件内容的输入输出操作(如书中19.1)。
4.应用:
能够通过重载插入和析取运算符进行自定义类的输入输出操作(如书中19.2)。
第十部分模板
复习知识点:
函数模板和类模板的定义格式,
函数模板和模板函数的区别,
类模板和模板类的区别,
类模板的实例化;
重载模板函数;
函数模板和类模板的简单应用。
复习要求:
理解:
函数模板和类模板的概念,重载模板函数的含义;
理解:
函数模板和类模板的定义格式和使用方法;
应用:
会分析出已定义的函数模板和类模板的功能,能够写出使用它们的程序的运行结果。
第十一部分面向对象程序设计环境
复习知识点:
程序开发的全过程
错误定位与调试
C++语言基本内容
复习要求:
给定一个程序要求,或者给定带错误的程序,要求学员在规定时间内在计算机上完成程序的编制(或修改)并调试运行通过,得到正确的结果。
期末考试题型及解答样例
是非题样例
1.头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。
2.派生类的成员函数可以直接访问基类的所有成员。
3.函数的参数和返回值类型可以是简单数据类型,也可以是指针、引用、数组和类。
4.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。
5.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。
6.若已经把类AA定义为类BB的友元类,则允许AA类中的所有成员函数访问类BB中的私有成员。
答案:
1.错2.错3.错4.对5.对6.对
填空题样例
下面是一个求数组元素之和的程序。
主程序中定义了并初始化了一个数组,然后计算该数组各元素的和,并输出结果。
函数sum计算数组元素之和。
填充程序中不完整的部分。
________A__________
intsum(int[],int);
voidmain()
{
intia[5]={2,3,6,8,10};
B;
sumOfArray=sum(ia,5);
cout<<"Sumofarray:
"<}
intsum(intarray[],intlen)
{
intiSum=0;
for(inti=0;C;D)
E;
returniSum;
}
答案:
A#include
BintsumOfArray;
CiDi++
EiSum+=array[i];
阅读理解题样例
程序1:
//file1.cpp
staticinti=20;
intx;
staticintg(intp)
{
returni+p;
}
voidf(intv)
{
x=g(v);
}
//file2.cpp
#include
externintx;
voidf(int);
voidmain()
{
inti=5;
f(i);
cout<}
回答以下问题:
1.程序的运行结果是什么样的?
2.为什么文件file2.cpp中要包含头文件?
3.在函数main()中是否可以直接调用函数g()?
为什么?
4.如果把文件file1.cpp中的两个函数定义的位置换一下,程序是否正确?
为什么?
5.文件file1.cpp和file2.cpp中的变量i的作用域分别是怎样的?
在程序中直接标出两个变量各自的作用域。
答案:
1.程序的运行结果:
25
2.因为程序中需要利用cout对象进行输出,而cout是在C++标准I/O库iostream中定义的类ostream的一个对象。
3.在函数main()中不可以直接调用函数g(),因为g()是静态函数,只在它所在的文件内可见。
4.如果把文件file1.cpp中的两个函数定义的位置换一下,程序不正确,因为C++规定所有使用的变量和函数需要先声明,后使用。
在函数f中用到了函数g,所以函数f不能出现在函数g的定义或声明之前。
5.文件file1.cpp中的变量i的作用域从它的定义开始到文件结束。
File2.cpp中的变量i的作用域从它的定义开始到main函数结束。
程序2:
/**********************文件list.h********************/
classAA
{
private:
int*a;
intlen;
constintMaxLen;
public:
AA(intMax_length=10):
MaxLen(Max_length)
{
a=newint[MaxLen];
len=0;
}
~AA(){delete[]a;}
boolInsert(intdata);
intDelete(int&data);
voidPrintAA();
voidPrintAA(char*);
boolIsEmpty(){returnlen==0;}
boolIsFull(){returnlen==MaxLen;}
intGetLen(){returnlen;}
intGetMaxLen(){returnMaxLen;}
intoperator[](inti){returna[i];}
intGetSum(inti);
};
/**********************文件list.cpp********************/
#include
#include
#include"list.h"
boolAA:
:
Insert(intdata)
{
if(len==MaxLen){
cout<<"overflow!
"<returnfalse;
}
a[len]=data;
len++;
returntrue;
}
intAA:
:
Delete(int&index)
{
if(len==0)
{
cout<<"No,Can'tbedeleted!
"<return0;
}
index=a[0];
for(inti=1;ilen--;
return1;
}
voidAA:
:
PrintAA()
{
for(inti=0;icout<}
voidAA:
:
PrintAA(char*str)
{
for(inti=0;icout<<"---"<}
intAA:
:
GetSum(inti)
{
if(i>len){
cout<<"Error!
"<exit
(1);
}
intsum=0;
for(intj=0;j
returnsum;
}
/************************文件main.cpp*****************/
#include
#include
#include"list.h"
voidmain()
{
AAx;
AAy(16);
if(x.IsEmpty()&&y.IsEmpty())
cout<<"Listsareemptywheninitialized!
"<elsereturn;
inti,k;
for(i=0;ifor(i=0;iif(x.IsFull()&&y.IsFull())cout<<"Listsarefull!
"<elsecout<<"Listsarenotfull!
"<for(i=0;i<(y.GetMaxLen())/2;i++)y.Delete(k);
x.PrintAA("List_x");
y.PrintAA("List_y");
for(i=0;i<(y.GetMaxLen())/2;i++)y.Insert(x[i]);
y.PrintAA();
cout<}
写出执行此程序所显示的结果:
答案:
Listsareemptywheninitialized!
Listsarefull!
0369121518212427---List_xlen=10
3944495459646974---List_ylen=8
3944495459646974036912151821
30245
程序3:
下面的文件queue.h是一个队列类模板Queue的完整实现。
在这个文件中首先定义了一个队列元素类模板QueueItem,然后在这个类的基础上定义了队列类模板Queue。
在Queue中使用链表存放队列的各个元素,front指针指向链表的第一个节点元素,back指针指向链表的最后一个节点元素,成员函数add()将一个新节点元素加入到队列结尾,remove()从队列开头删除一个节点元素。
为方便起见,程序中加上了行号。
阅读程序,根据程序后面的问题作出相应解答。
/*------------------------------------------------------------------/
/*********************文件queue.h***********************/
/*-----------------------------------------------------------------/
1template
2classQueue;
3/*****************定义模板类QueueItem************/
4template
5classQueueItem
6{
7public:
8QueueItem(constType&elem):
item(elem){}
9QueueItem(){}
10private:
11Typeitem;
12QueueItem*nextItem;
13friendclassQueue;
14};
15/*****************定义模板类Queue************/
16template
17classQueue{
18public:
19Queue():
front(NULL),____(A)_____{}
20~Queue();
21Typeremove();
22voidadd(constType&);
23boolis_empty()const{return____(B)______;}
24private:
25QueueItem*front;
26QueueItem*back;
27};
28//模板类Queue的函数成员remove()的实现
29//从队列头取出一个节点,并返回该节点的值
30template
31TypeQueue:
:
remove()
32{
33QueueItem*pFront;//指向头节点的临时指针
34TyperetVal;//返回值
35______(C)_________;
36retVal=front->item;
37front=front->nextItem;
38deletepFront;
39returnretVal;
40}
41//模板类Queue的函数成员add()的实现
42template
43voidQueue:
:
add(constType&newItem)
44{
45QueueItem*pNew=newQueueItem;
46pNew->item=newItem;
47______(D)____________;
48if(front==NULL)
49front=back=pNew;
50else
51{
52back->nextItem=pNew;
53_____(E)__________;
54}
55}
56
57template
58Queue:
:
~Queue()
59{
60QueueItem*p=front,*q;
61while(p!
=NULL)
62{
63q=p->nextItem;
64deletep;
65p=q;
66}
67}
问题1:
(每个填空3分,共15分)程序中有几处填空,将它们完成。
(A)_________________________________________________
(B)_________________________________________________
(C)_________________________________________________
(