面向对象程序设计教程(C++语言描述)题解与课程设计指导
第1章
面向对象程序设计概论
一、名词解释
抽象封装消息
【问题解答】
面向对象方法中得抽象就是指对具体问题(对象)进行概括,抽出一类对象得公共性质并加以描述得过程。
面向对象方法中得封装就就是把抽象出来得对象得属性与行为结合成一个独立得单位,并尽可能隐蔽对象得内部细节。
消息就是面向对象程序设计用来描述对象之间通信得机制。一个消息就就是一个对象要求另一个对象实施某种操作得一个请求。
二、填空题
(1) 目前有面向过程得结构化程序设计方法与面向对象得程序设计方法两种重要得程序设计方法。
(2) 结构化程序设计方法中得模块由顺序、选择与循环3种基本结构组成。
(3) 在结构化程序设计方法中,程序可表示为程序=数据结构+算法; 而面向对象得程序设计方法,程序可表示为程序=对象+消息。
(4) 结构化程序设计方法中得基本模块就是过程; 而面向对象程序设计方法中得基本模块就是类。
(5) 面向对象程序设计方法具有抽象性、封装性、继承性与多态性等特点。
三、选择题(至少选一个,可以多选)
(1) 面向对象程序设计着重于( B )得设计。
A、对象B. 类C、算法D、数据
(2) 面向对象程序设计中,把对象得属性与行为组织在同一个模块内得机制叫做( C )。
A、抽象
B、继承
C、封装
D、多态
(3) 在面向对象程序设计中,类通过( D )与外界发生关系、
A。对象B。类C。消息D。接口
(4) 面向对象程序设计中,对象与对象之间得通信机制就是( C )。
A、对象
B、类C。消息 D、接口
(5) 关于C++与C语言得关系得描述中,( D )就是错误得、
A。 C语言就是C++得一个子集 B. C语言与C++就是兼容得
C. C++对C语言进行了一些改进 D、C++与C语言都就是面向对象得
【结果分析】
C语言就是面向过程得。C++语言就是一种经过改进得更为优化得C语言,就是一种混合型语言,既面向过程也面向对象。
(6) 面向对象得程序设计将数据结构与( A)放在一起,作为一个相互依存、不可分割得整体来处理、
A、算法 B. 信息 C。数据隐藏D. 数据抽象
(7) 下面( A )不就是面向对象系统所包含得要素。
A. 重载B。对象C。类 D、继承
【结果分析】
面向对象=对象+类+继承+消息+多态
(8) 下面说法正确得就是( BC )。
A。将数据结构与算法置于同一个函数内,即为数据封装
B、一个类通过继承可以获得另一个类得特性
C、面向对象要求程序员集中于事物得本质特征,用抽象得观点瞧待程序
D、同一消息为不同得对象接受时,产生得行为就是一样得,这称为一致性
【结果分析】
面向对象程序设计方法具有抽象性、封装性、继承性与多态性等特点。将数据结构与算法置于同一个类内,即为数据封装。同一消息为不同得对象接受时,产生得行为可能就是不一样得,这称为多态性。
(9) 下面说法正确得就是( AD )。
A. 对象就是计算机内存中得一块区域,它可以存放代码与数据
B。对象实际就是功能相对独立得一段程序
C. 各个对象间得数据可以共享就是对象得一大优点
D、在面向对象得程序中,对象之间只能通过消息相互通信
【结果分析】
对象就是计算机内存中得一块区域。在对象中,不但存有数据,而且存有代码,使得每个对象在功能上相互之间保持相对独立。对象之间存在各种联系,但它们之间只能通过消息进行通信。
四、判断题
(1) 在高级程序设计语言中,一般用类来实现对象,类就是具有相同属性与行为得一组对象得集合,它就是创建对象得模板、( √ )
(2) C++语言只支持面向对象技术得抽象性、封装性、继承性等特性,而不支持多态性。( × )
【结果分析】
C++语言不仅支持面向对象技术得抽象性、封装性、继承性等特性,而且支持多态性。
(3) 面向对象程序设计中得消息应该包含“如何做”得信息、( × )
【结果分析】
消息就是面向对象程序设计用来描述对象之间通信得机制。向对象“发送消息”只需告诉对象做什么,对象根据这个消息决定如何做。
(4) 一个消息只能产生特定得响应效果。( × )
【结果分析】
当一个对象发出消息时,由于接收对象得类型可能不同,所以,它们可能做出不同得反应。这样,一个消息可以产生不同得响应效果,这种现象叫做多态。
(5) 类得设计与类得继承机制实现了软件模块得可重用性。( √)
(6) C++语言与Java语言均不就是一个纯正得面向对象得程序设计得语言。( × )
【结果分析】
Java语言就是一个纯正得面向对象得程序设计语言。
(7) 学习C++语言就是学习面向对象得程序设计方法得唯一途径。( × )
【结果分析】
程序设计方法就是独立于具体程序设计语言得一种技术,学习C++语言就是学
习面向对象程序设计方法得重要途径之一。
(8) 在C++语言中,类就是支持数据封装得工具。( √ )
五、简答题
(1) 什么就是结构化程序设计方法?它有哪些优点与缺点?
【问题解答】
结构化程序设计方法着眼于系统要实现得功能,从系统得输入输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统得功能进行分解,来建立系统得功能结构与相应得程序模块结构,有效地将一个较复杂得程序系统设计任务分解成许多易于控制与处理得子任务,便于开发与维护。
随着程序规模与复杂性得增长,这种面向过程得结构化程序设计方法存在明显得不足之处。首先就是数据安全性问题。由于数据被每个模块所共用,因此就是不安全得,一旦出错,很难查明原因。其次就是可维护性及可重用性差。它把数据结构与算法分离为相互独立得实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新得错误。每一种相对于老问题得新方法都要带来额外得开销、另外,图形用户界面得应用程序,很难用过程来描述与实现,开发与维护也都很困难、
(2) 什么就是面向对象程序设计方法?它有哪些优点?
【问题解答】
面向对象得程序设计方法中,将程序设计为一组相互协作得对象而不就是一组相互协作得函数、在程序中,属性用数据表示,用来描述对象静态特征; 行为用程序代码实现,用来描述对象动态特征。可见,在面向对象得程序设计方法中,对象就是数据结构与算法得封装体。对象之间存在各种联系,它们之间通过消息进行通信、程序可表示为:
程序=对象+消息
在面向对象程序设计中应着重于类得设计。类正就是面向对象语言得基本程序模块,通过类得设计来完成实体得建模任务。类通过一个简单得外部接口与外界发生关系、一个类中得操作不会处理到另一个类中得数据,这样程序模块得独立性、数据得安全性就有了良好得保障。程序得执行取决于事件发生得顺序,由顺序产生得消息来驱动程序得执行。不必预先确定消息产生得顺序,更符合客观世界得实际。并且面向对象程序设计方法提供了软件重用、解决大问题与复杂问题得有效途径,具有抽象性、封装性、继承性与多态性等特点。
(3) 结构化程序设计方法与面向对象程序设计方法在对待数据结构与算法关系上有什么不同?
【问题解答】
结构化程序设计方法中,把数据结构与算法分离为相互独立得实体; 而在面向对象程序设计中,数据结构与算法封装在一起,结合成一个独立得单位,即对象,并尽可能隐蔽对象得内部细节。对象得私有属性只能由这个对象得行为来读取与修改,与外部得联系通过公有行为充当外部接口。
第
2
章
从C到C++
面向对象程序设计教程(C++语言描述)题解与课程设计指导
第2章
从C到
C++
一、名词解释
引用内联函数重载函数
【问题解答】
所谓引用就就是给对象取一个别名,使用该别名可以存取该对象、换句话说就是使新对象与原对象共用一个地址。
内联函数就是使用inline关键字声明得函数。
重载函数指在同一个作用域内名字相同而参数不同得函数。重载函数通常用来对具有相似行为而数据类型或数据个数不同得操作提供—个通用得名称、
二、填空题
(1) 一般情况下,用C++语言编写得程序就是由函数加上类组成得、
(2) C++有两种注释符号,一种就是//,另一种就是/*……*/、
(3) 使用C++风格得输入输出,在程序中必须包含头文件“iostream”、(4) cin就是预定义得标准输入流对象,〉〉就是输入操作符,也称提取运算符。
(5) cout就是预定义得标准输出流对象,<〈就是输出操作符,也称插入运算符。
(6) 指针得值就是它所指向那个对象得地址值。指针得类型就是它所指向对象得类型、指针得内容便就是它所指向对象得值。
(7) C++使用运算符&来定义一个引用,对引用得存取都就是对它所引用得对象得存取。
(8) 当一个函数调用出现在函数定义之前时,必须先用函数原型对函数进行声明。
(9) C++有值传递与引用传递两种参数传递机制。
(10) 使用关键字inline声明得函数称为内联函数。
(11) 运算符new用于进行动态内存分配,运算符delete用于释放动态分配得内存。
(12) 下面程序得输出结果为x=10,y=10;
x=100,y=100。
#include<iostream〉
using namespace std;
int main()
{
int x=10,&y=x;
cout<〈"x="<〈x<〈",y="〈<y<〈endl;
int *p=&y;
*p=100;
cout〈<"x=”< return 0; } 三、选择题(至少选一个,可以多选) (1) 在整型指针变量p2、p3得定义中,错误得就是( A )、 A. int p1,*p2,p3; B、int*p2,p1,*p3; C. int p1,*p2=&p1,*p3; D、 int*p2,p1,*p3=&p1; 【结果分析】 指针定义得具体格式如下所示: 〈类型>*〈指针名1>,*〈指针名2〉,…; (2) 若有定义“double xx=3。14,*pp=&xx; ”,则*pp等价于 ( C )、 A、 &xxB、 *xxC. 3、14D. xx 【结果分析】 pp指向xx所在得内存单元,这样*pp与xx等价、 (3) 下面对引用得描述中( C )就是错误得。 A、引用就是某个变量或对象得别名 B、建立引用时,要对它初始化 C. 对引用初始化可以使用任意类型得变量 D、引用与其代表得对象具有相同得地址 【结果分析】 所谓引用就就是给对象取一个别名,使用该别名可以存取该对象,所以对引用初始化必须使用同类型得变量。 (4) 函数没有返回值得时候,应该选择( A )得函数类型、 A。void B、 int C。不确定 D. float (5) 在函数得定义格式中,下面各组成部分中,( D )就是可以省略得。A。函数名 B、函数体 C、返回值类型 D. 函数参数 【结果分析】 函数得定义可以缺省形式参数,此时称为无参函数。 (6) 对重载得函数来说,下面叙述不正确得就是( D )。 A、参数得类型不同 B。参数得顺序不同 C。参数得个数不同 D、参数得个数、类型、顺序都相同,但函数得返回值类型不同 【结果分析】 对重载得函数来说,编译系统将根据函数参数得类型与个数来判断使用哪一个函数,所以重载函数参数得个数、类型、顺序不能都相同。 (7) 下列有关设置函数参数默认值得描述中,( D )就是正确得、 A。对设置函数参数默认值得顺序没有任何规定 B。函数具有一个参数时不能设置默认值 C。默认参数要设置在函数得原型中,而不能设置在函数得定义语句中 D、设置默认参数可使用表达式,但表达式中不可用局部变量 【结果分析】 在C++中,在函数原型中可以为一个或多个参数指定默认值。对函数参数设置默认值要注意以下几点。 ◆若没有声明函数原型,参数得默认值可在函数定义得头部进行设置,否则必须在函数原型中进行设置。 ◆在一个指定了默认值得参数右边不能出现没有指定默认值得参数。 ◆设置默认参数可使用表达式,但表达式中不可用局部变量。 (8) 下面说法正确得就是( BC )。 A. 所有得函数都可以说明为内联函数 B、具有循环语句、switch语句得函数不能说明为内联函数 C、使用内联函数,可以加快程序执行得速度,但会增加程序代码得大小 D。使用内联函数,可以减小程序代码大小,但使程序执行得速度减慢 【结果分析】 内联函数主要就是解决程序得运行效率问题。在程序编译时,编译系统将程序中出现内联函数调用得地方用函数体进行替换,进而减少了程序运行得时间,但会增加程序代码得大小。它就是以空间换取时间,因此内联函数适用于功能不太复杂,但要求被频繁调用得函数。 (9) 一个函数功能不太复杂,但要求被频繁调用,应选用( A )。 A、内联函数 B。重载函数C. 递归函数D、嵌套函数(10) C++对C语言做了很多改进,下列描述中使得C语言发生了质变,即从面向过程变成面向对象得就是( D)。 A。增加了一些新得运算符 B、允许函数重载,并允许设置默认参数 C、规定函数说明必须用原型 D。引进了类与对象得概念 【结果分析】 面向对象=对象+类+继承+消息+多态 四、判断题 (1) C++程序中,不得使用没有定义或说明得变量。( √) (2) 使用const说明常量时,可以不必指出类型。( ×) 【结果分析】 如果用const定义得就是一个整型常量,则类型说明符int可以省略、 (3) 引用被创建时可以用任意变量进行初始化。( × ) 【结果分析】 对引用初始化必须使用同类型得变量。 (4) 一个返回引用得调用函数可以作为左值。( √ ) (5) 函数可以没有参数,也可以没有返回值。( √ ) (6) 没有参数得两个函数就是不能重载得。( √) (7) 函数可设置默认参数,但不允许将一个函数得所有参数都设置为默认参数。( × ) 【结果分析】 函数可设置默认参数,且允许将一个函数得所有参数都设置为默认参数。 (8) 运算符new分配得空间由运算符delete释放、( √) 五、简答题 (1) 名字空间得用途就是什么? 【问题解答】 名字空间用来防止命名得冲突。 (2) 引用有何用处? 【问题解答】 除了独立引用外,在C++程序中,引用得主要用途就是用作函数参数与函数得返回值。 (3) 比较值调用与引用调用得相同点与不同点、 【问题解答】 在值调用机制中,作为实参得表达式得值被复制到由对应得形参名所标识得一个对象中,作为形参得初始值。函数体对形参得访问、修改都就是在这个标识对象上操作得,与实参无关,即数据得传递就是单向得。 使用引用作函数得形参时,调用函数得实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参得别名。于就是,在被调用函数中对形参得操作实质就是对实参得直接操作,即数据得传递就是双向得、 (4) 内联函数有什么作用?它有哪些特点? 【问题解答】 内联函数就是使用inline关键字声明得函数。在程序编译时,编译系统将程序中出现内联函数调用得地方用函数体进行替换,进而减少了程序运行得时间。使用内联函数应注意以下几点。 ◆递归函数不能定义为内联函数、 ◆内联函数一般适合于不含有switch与while等复杂得结构且只有1~5条语句得小函数,否则编译系统将该函数视为普通函数。 ◆内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。 ◆对内联函数也不能进行异常接口声明。 (5) 函数原型中得参数名与函数定义中得参数名以及函数调用中得参数名必须一致吗? 【问题解答】 不必一致。所有得参数就是根据位置与类型而不就是名字来区分得。 (6) 重载函数时通过什么来区分? 【问题解答】 编译系统将根据函数参数得类型与个数来判断使用哪一个函数、 六、程序分析题(写出程序得输出结果,并分析结果) #include〈iostream〉 using namespace std; int main() { int num=50; int& ref=num; ref=ref+10; cout<〈"num="< num=num+40; cout<〈"ref=”<<ref< return 0; } 【输出结果】 num=60 ref=100 【问题分析】 本题主要考查引用得含义。 【结果分析】 程序首先定义一个int类型得对象num,并给它赋初始值50。然后又定义了一个int类型得引用ref,并将它与num相联系。这样,无论就是对num还就是对ref进行操作,实际上都就是对那个一开始放着50得物理单元得内容进行操作。 七、程序设计题 写出一个完整得C++程序,使用系统函数pow(x,y)计算xy得值,注意包含头文件cmath。 【问题分析】 本题主要考查简单得输入输出与标准库函数得调用方法。 【解题思路】 ① 由于要用到系统函数pow(x,y),所以要包含头文件cmath。 ② 要计算xy得值,首先必须知道x与y得值。为了程序得通用性,最好通过交互得方式输入x与y得值。 【参考程序】 // xt2_1.cpp #include〈iostream〉 #include〈cmath〉 usingnamespace std; int main() { float x,y; cout<〈"please input 2 floats to x,y:”; cin>>x>>y; float z=pow(x,y); cout<〈"pow("〈 return0; } 【输出结果】 please input 2 floats to x,y:3、1 2 pow(3、1,2)=9。61 第 3 章 类与对象 面向对象程序设计教程(C++语言描述)题解与课程设计指导 第3章 类与对象 一、填空题 (1) 类定义中关键字private、public与protected以后得成员得访问权限分别就是私有、公有与保护。如果没有使用关键字,则所有成员默认定义为private权限。具有public访问权限得数据成员才能被不属于该类得函数所直接访问。 (2) 定义成员函数时,运算符“∷"就是作用域运算符,“MyClass∷”用于表明其后得成员函数就是在“MyClass类”中说明得。 (3) 在程序运行时,通过为对象分配内存来创建对象、在创建对象时,使用类作为样板,故称对象为类得实例、 (4) 假定Dc就是一个类,则执行“Dc a[10],b(2)”语句时,系统自动调用该类构造函数得次数为11。 【结果分析】 创建10个数组元素需调用构造函数10次,创建对象b需调用构造函数1次,所以系统自动调用该类构造函数得总次数为11。 (5) 对于任意一个类,析构函数得个数最多为1个。 (6) delete运算符通常用于实现释放该类对象中指针成员所指向得动态存储空间得任务。 (7) C++程序得内存格局通常分为4个区: 数据区、代码区、栈区与堆区、 (8) 数据定义为全局变量,破坏了数据得封装性; 较好得解决办法就是将所要共享得数据定义为类得静态成员、 (9) 静态数据成员与静态成员函数可由任意访问权限许可得函数访问。 (10) 友元函数与友元类统称为友元。 (11) 友元得正确使用能提高程序得效率,但破坏了类得封装性与数据得隐蔽性。 (12) 若需要把一个类A定义为一个类B得友元类,则应在类B得定义中加入一条语句: friend class A;。 二、选择题(至少选一个,可以多选) (1) 以下不属于类访问权限得就是( B )。 A、public B. staticC。protectedD. private 【结果分析】 类得访问权限有public、protected 与private。 (2) 有关类得说法不正确得就是( BC )。 A、类就是一种用户自定义得数据类型 B、只有类得成员函数才能访问类得私有数据成员 C、在类中,如不做权限说明,所有得数据成员都就是公有得 D. 在类中,如不做权限说明,所有得数据成员都就是私有得 【结果分析】 类就是一种用户自定义得数据类型,类中成员均具有一种访问权限。关键字public、protected 与private以后得成员得访问权限分别就是公有、保护与私有得,所有成员默认定义为private得、 私有成员就是被隐藏得数据,只有该类得成员函数或友元函数才可以访问它。(3) 在类定义得外部,可以被任意函数访问得成员有( C )。 A。所有类成员B、 private或protected得类成员 C。 public得类成员 D. public或private得类成员 【结果分析】 类就是一种用户自定义得数据类型,类中成员均具有一种访问权限。公有成员定义了类得外部接口。私有成员就是被隐藏得数据,只有该类得成员函数或友元函数才可以引用它。保护成员具有公有成员与私有成员得双重性质,可以被该类或派生类得成员函数或友元函数引用。可见在类定义得外部,可以被任意函数访问得成员就是public得类成员。 (4) 关于类与对象得说法( C )就是错误得。 A. 对象就是类得一个实例 B、任何一个对象只能属于一个具体得类 C、一个类只能有一个对象 D。类与对象得关系与数据类型与变量得关系相似 【结果分析】 C++语言得类就就是一种用户自己定义得数据类型,类与对象得关系就相当于基本数据类型与它得变量得关系,所以任何一个对象只能属于一个具体得类,但一个类可以有多个对象。 (5) 设MClass就是一个类,dd就是它得一个对象,pp就是指向dd得指针,c c就是dd得引用,则对成员得访问,对象dd可以通过( B )进行,指针pp可以通过( D )进行,引用cc可以通过( B )进行。 A。∷ B、. C、& D. —> (6) 关于成员函数得说法中不正确得就是( C )。 A. 成员函数可以无返回值 B、成员函数可以重载 C。成员函数一定就是内联函数 D。成员函数可以设定参数得默认值 【结果分析】 与普通函数不同得就是,成员函数就是属于某个类得、成员函数得实现,可以放在类体内,也可以放在类体外、在类体外实现得成员函数不再就是内联函数。 (7) 下面对构造函数得不正确描述就是( B )。 A、系统可以提供默认得构造函数 B、构造函数可以有参数,所以也可以有返回值 C。构造函数可以重载 D、构造函数可以设置默认参数 【结果分析】 构造函数不能指定返回类型,即使就是void类型也不可以,当然不可能有返回值。 (8) 假定A就是一个类,那么执行语句“A a,b(3),*p; ”调用了( B ) 次构造函数。 A、 1 B. 2 C、 3 D、4 【结果分析】 声明指针就是不会调用构造函数得。 (9) 下面对析构函数得正确描述就是( AC )。 A. 系统可以提供默认得析构函数 B. 析构函数必须由用户定义 C。析构函数没有参数 D。析构函数可以设置默认参数 【结果分析】 析构函数得作用就是在对象消失时执行一项清理任务、如果一个类中没有定义析构函数,系统将自动生成一个默认析构函数。析构函数没有参数,当然不可能设置默认参数。 (10) 类得析构函数就是( D )时被调用得。 A、类创建 B. 创建对象 C。引用对象 D、释放对象(11) 创建一个类得对象时,系统自动调用( B ); 撤销对象时,系统自动调用( C )。 A。成员函数B。构造函数C、析构函数 D、复制构造函数(12) 通常拷贝构造函数得参数就是( C )。 A、某个对象名 B、某个对象得成员名C。某个对象得引用名D、某个对象得指针名 (13) 关于this指针得说法正确得就是( B )、 A、this指针必须显式说明 B、当创建一个对象后,this指针就指向该对象C。成员函数拥有this指针D、静态成员函数拥有this指针、 【结果分析】 this指针就是由C++编译器自动产生且较常用得一个隐含对象指针,它不能被显式声明、当创建一个对象时,this指针就初始化指向该对象。但只有非静态成员函数才拥有this指针,并通过该指针来处理对象。 (14) 下列关于子对象得描述中,( B )就是错误得。 A。子对象就是类得一种数据成员,它就是另一个类得对象 B。子对象可以就是自身类得对象 C。对子对象得初始化要包含在该类得构造函数中 D。一个类中能含有多个子对象作其成员 【结果分析】 子对象不可以就是自身类得对象。 (15) 对new运算符得下列描述中,( B )就是错误得。 A。它可以动态创建对象与对象数组 B。用它创建对象数组时必须指定初始值 C、用它创建对象时要调用构造函数 D、用它创建得对象数组可以使用运算符delete来一次释放 【结果分析】 使用运算符new创建对象数组得格式如下: new 〈类型说明符〉[〈算术表达式〉] 其中,〈算术表达式>给出数组得大小,后面不能再跟构造函数参数,所以用它创建对象数组时不能指定初始值。 (16) 对delete运算符得下列描述中,( D )就是错误得。 A。用它可以释放用new运算符创建得对象与对象数组 B、用它释放一个对象时,它作用于一个new所返回得指针 C. 用它释放一个对象数组时,它作用得指针名前须加下标运算符[ ] D、用它可一次释放用new运算符创建得多个对象 【结果分析】 用delete一次只能释放用new创建得1个对象,但可释放一个对象数组。 (17) 关于静态数据成员,下面叙述不正确得就是( C )。 A. 使用静态数据成员,实际上就是为了消除全局变量 B。可以使用“对象名。静态成员”或者“类名∷静态成员"来访问静态数据成员 C、静态数据成员只能在静态成员函数中引用 D、所有对象得静态数据成员占用同一内存单元 【结果分析】 静态数据成员可以在静态成员函数中引用,也可以在非静态成员函数中引用。 (18) 对静态数据成员得不正确描述就是( CD )。 A、静态成员不属于对象,就是类得共享成员 B、静态数据成员要在类外定义与初始化 C. 调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针 D、只有静态成员函数可以操作静态数据成员 【结果分析】 this指针就是一个局部量,局部于某个对象,而静态成员函数就是属于整个类而不就是某个对象,它没有this指针、静态成员函数与非静态成员函数均可操作静态数据成员。 (19) 下面得选项中,静态成员函数不能直接访问得就是( D )。 A、静态数据成员 B。静态成员函数 C、类以外得函数与数据 D、非静态数据成员 【结果分析】 由于静态成员函数没有this指针,它只能直接访问该类得静态数据成员、静态成员函数与类以外得函数与数据,访问类中得非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。 (20) 在类得定义中,引入友元得原因就是( A )、 A。提高效率 B. 深化使用类得封装性C。提高程序得可读性D。提高数据得隐蔽性 【结果分析】 友元得作用主要就是为了提高效率与方便编程,但友元破坏了类得封装性与隐蔽性,使用时要权衡利弊。 (21) 友元类得声明方法就是( A )。 A、 friend class〈类名>; B。 youyuanclass<类名〉; C、class friend〈类名>; D。 friends class 〈类名>; (22) 下面对友元得错误描述就是( D )。 A。关键字friend用于声明友元 B。一个类中得成员函数可以就是另一个类得友元 C、友元函数访问对象得成员不受访问特性影响 D、友元函数通过this指针访问对象成员 【结果分析】 友元函数就是一个放在类中得普通函数,它没有this指针。 (23) 下面选项中,( C )不就是类得成员函数。 A。构造函数B。析构函数 C。友元函数 D、拷贝构造函数 三、简答题 (1) 类与对象有什么关系? 【问题解答】 类就是一种用户自己定义得数据类型,与其她数据类型不同得就是,组成这种类型得不仅可以有数据,而且可以有对数据进行操作得函数。程序员可以使用这个新类型在程序中声明新得变量,具有类类型得变量称为对象。创建对象时,类被用做样板,对象称为类得实例、 (2) 类定义得一般形式就是什么?其成员有哪几种访问权限? 【问题解答】 定义类一般形式为: class类名{ public: <公有数据与函数〉 protected: <保护数据与函数> private: 〈私有数据与函数> }; 访问权限共有3种: 分别就是公有(public)、保护(protected)与私有(priv ate)。 (3) 类得实例化就是指创建类得对象还就是定义类? 【问题解答】 指创建类得对象。 (4) 什么就是this指针?它得主要作用就是什么? 【问题解答】 this指针就是C++语言为成员函数提供得一个隐含对象指针,它不能被显式声明、this指针就是一个局部量,局部于某个对象。不同得对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象得数据成员。 (5) 什么叫做拷贝构造函数?拷贝构造函数何时被调用? 【问题解答】 拷贝构造函数就是一种特殊得构造函数,它得作用就是用一个已经存在得对象去初始化另一个对象。为了保证所引用得对象不被修改,通常把引用参数声明为const参数。 在以下3种情况下,拷贝构造函数都会被自动调用: ◆当用类得一个对象去初始化该类得另一个对象时; ◆当函数得形参就是类得对象,进行形参与实参结合时; ◆当函数得返回值就是类得对象,函数执行完成返回调用者时。 四、程序分析题(写出程序得输出结果,并分析结果) (1) #include<iostream> using namespace std; class Test { private: int num; public: Test();// 默认构造函数 Test(int n); // 带一个参数构造函数 }; Test∷Test() { cout<〈"Init defa”<〈endl; num=0; } Test∷Test(int n) { cout<<"Init"<<" "< num=n; } int main() { Test x[2];// 语句1 Test y(15); // 语句2 return 0; } 【输出结果】 Initdefa Init defa Init 15 【问题分析】 本题主要考查构造函数得调用时机与构造函数得匹配问题。 【要点提示】 构造函数在创建对象时被自动调用,具体调用哪个构造函数将由编译系统根据重载函数得匹配原则来确定。 【结果分析】 ① 程序声明了2个对象x与y,类中有2个构造函数。 ② 程序首先执行语句1,创建对象x,调用默认构造函数。由于对象x就是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2行结果。程序接着执行语句2,创建对象y,调用带一个参数得构造函数,输出第3行结果。 (2) #include using namespace std; class Xx { private: int num; public: Xx(intx){num=x;} // 构造函数 ~Xx(){cout<<”dst ”<<num〈〈endl;} // 析构函数 }; intmain() { Xx w(5); //语句1 cout<<"Exitmain”〈<endl; // 语句2 return 0; } 【输出结果】 Exit main dst 5 【问题分析】 本题主要考查析构函数得调用时机。 【要点提示】 析构函数在释放对象时被自动调用。 【结果分析】 ① 程序声明了一个对象w。 ②程序首先执行语句1,创建对象w,调用构造函数,num得到初值5、程序接着执行语句2,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2行结果、 (3) 将例3、10中得Whole类如下修改,其她部分不变,写出输出结果。 class Whole { public: Whole(int i); // Whole得有参构造函数 Whole(){}; // Whole得无参构造函数 ~Whole(); // Whole得析构函数 private: Part p1;//子对象1 Part p2;// 子对象2 Part p3;// 子对象3 }; Whole∷Whole(int i):p2(i),p1() { cout<〈”Constructor of Whole"<<endl; } Whole∷~Whole() { cout<<”Destructor of Whole"<<endl; } 【输出结果】 Default constructor ofPart Constructor of Part,3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part,0 Destructor of Part,3 Destructor of Part,0 【问题分析】 本题主要考查子对象初始化得方法与含有子对象时构造函数与析构函数得调用顺序、 【要点提示】 ◆当建立X类得对象时,先调用子对象得构造函数,初始化子对象,然后才执行X 类得构造函数,初始化X类中得其她成员。 ◆对子对象构造函数得调用顺序取决于这些子对象在类中得说明顺序,与它们在成员初始化列表中给出得顺序无关。 ◆如果X类得构造函数没有给出成员初始化列表,表明子对象将使用默认构造函数进行初始化。 ◆析构函数得调用顺序与构造函数得调用顺序正好相反。 【结果分析】 程序得Whole类中出现了类Part得3个对象p1、p2与p3,作为该类得数据成员,则p1、p2与p3被称为子对象。当建立Whole类得对象w时,子对象p1、p2与p3被建立,相应得构造函数被执行。由于p1在Whole类中先说明,所以先执行它所使用得构造函数,即类Part得默认构造函数,接着p2执行它所使用得有参构造函数,紧接着初始化p3,由于Whole类构造函数得成员初始化列表中没有子对象p3进行初始化得选项,所以执行类Part得默认构造函数,当所有子对象被构造完之后,对象w得构造函数才被执行,从而得到前4行输出结果,而后4行就是执行相应析构函数得输出结果。 (4) #include〈iostream〉 using namespace std; class Book { public: Book(int w); static int sumnum; private: int num; }; Book∷Book(int w) { num=w; sumnum—=w; } intBook∷sumnum=120;//语句1 int main() { Book b1(20);// 语句2 Book b2(70);// 语句3 cout〈〈Book∷sumnum< return 0; } 【输出结果】 30 【问题分析】 本题主要考查“在类得范围内所有对象共享静态成员得数据”得含义。 【结果分析】 程序中语句1对静态成员sumnum进行初始化,sumnum得到初值120。执行语句2时,调用构造函数,sumnum变为100。接着语句3,再调用构造函数,sumnum变为30、 五、程序设计题 (1) 声明一个Circle类,有数据成员radius(半径)、成员函数area(),计算圆得面积,构造一个Circle得对象进行测试。 【问题分析】 本题主要考查类定义得形式、对象成员访问与对象初始化得方法。要求理解类与构造函数得真正含义,特别注意如何将客观事物得属性与行为抽象为类得成员。【解题思路】 ①题目中已给出了类得基本部分,需要增加一个构造函数来初始化数据成员radius、 ② 为了程序得通用性,圆得半径由键盘输入。 【参考程序】 //xt3_1.cpp #include 第3章面向对象程序设计基础 第3章面向对象程序设计基础 【1】什么是Java程序使用的类?什么是类库? 答:类是将一类事物的特性描述出来,然后如果用这个类来定义对象,则该对象就拥有了这个类所描述的所有特性。 在Java系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合,每个集合称为一个包,所有包合称为类库。 【2】如何定义方法?在面向对象程序设计中方法有什么作用? 答:方法的定义由两部分组成:方法声明和方法体。 方法的声明如下: 返回值类型方法名(参数类型形式参数1,参数类型形式参数2…){ 程序代码; 返回值; } 在面向对象程序设计中,方法的作用是完成对类和对象属性操作。 【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。 void Student(int no,String name) { studentNo=no; studentName=name; return no; } 答:构造方法的功能是:构造方法是一个特殊的方法,主要用于初始化新创建的对象; 特点:构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。 错误之处:(1)构造方法Student()前不能加void,(2)不能用return语句,(3)类名Student 首字母S改成小写s. 【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。 class Student { String id; String name; String sex; int age; void talk(){ 2018年真题(5题全答,每题20分) 1、岩浆矿床控制因素及如何评价含矿性? 2、夕卡岩成矿作用及如何寻找夕卡岩矿床? 3、矿床成因研究内容,研究方法及步骤? 4、金矿、铅锌矿、铜矿成因类型及特点(论述1种矿产)? 5、沉积矿床的特点及沉积建造如何控制成矿? 2017年真题(5选4,每题25分) 1、举例说明我国超大型钨矿、铜矿、稀土矿、锑矿、铅锌矿的成因类型及其成矿特点? 2、举例论述两种我国主要的铁矿床成矿特征? 3、论述斑岩钼矿的成矿特征及成因? 4、矿产勘查学近年来有哪些新的研究成果? 5、矿床学研究方法和步骤? 2016年真题(5选4,每题25分) 1、伟晶岩矿床的特点及其形成条件; 2、请论述以下蚀变的含义,形成条件、特征及其可能相关矿种: 矽卡岩化、黄铁绢英岩化、重晶石化、钠长石化、冰长石化; 3、请论述造山型矿床的特点及其成矿成因; 4、沉积铁、锰、铝矿床的特点及其形成机理; 5、请论述矿化阶段、矿物生成顺序和矿物世代的鉴别标志,并以你熟悉的矿床为例,介绍如何编制矿物生成顺序表。 2015年真题(5选4,每题25分) 1、岩浆矿床的形成条件与成矿作用 2、铜矿床的工业类型的地质特征,举1~2个实例 3、举例说明金属硫化物矿床的表生变化与次生富集作用 4、VMS与SEDEX的主要区别 5、下列矿物在偏光显微镜下鉴别特征 黄铁矿、闪锌矿、毒砂、辉锑矿、雌黄、雄黄 2014年真题(6选5,每题20分) 1、举例说明地质异常在找矿评价中的作用 2、简述矿床学的主要研究内容和方法 3、结合实际分析成矿系列及其在找矿中的应用 4、简述铁矿床的主要类型和特点 5、根据我国的矿产资源特点谈谈我国矿业发展的思路 6、简述经过我国境内的世界三大成矿带特点 2012年真题(6选5,每题20分) 1、热液矿床的成矿物质沉淀机制 2、岩浆结晶分异作用、岩浆熔离作用、岩浆爆发作用,各自形成矿产种类 3、MVT特征、成因、意义 4、残余型矿床特征、成因、意义 5、BIF特征、成因、意义 6、以自己熟悉矿床类型,举例说明对热液矿床地质特征及物理化学第3章 面向对象程序设计基础
中国地质大学2005-2018年博士入学考试矿床学真题
(完整版)《面向对象程序设计》答案