c第1-3章答案_第1页
c第1-3章答案_第2页
c第1-3章答案_第3页
c第1-3章答案_第4页
c第1-3章答案_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+习题参考答案 第 1xx 面向对象程序设计概论 一、名词解释 抽象封装消息 问题解答】 面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象 的公共性质并加以描述的过程。 面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独 立的单位,并尽可能隐蔽对象的内部细节。 消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是 个对象要求另一个对象实施某种操作的一个请求。 二、填空题 (1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两 种重要的程序设计方法。 ( 2)结构化程序设计方法中的模块由顺序、选择和循环 3 种基本结构组 成。 ( 3)在结构

2、化程序设计方法中,程序可表示为程序 =数据结构 +算法;而面 向对象的程序设计方法,程序可表示为程序 =对象 +消息。 (4)结构化程序设计方法中的基本模块是过程;而面向对象程序设计方法 中的基本模块是类。 (5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特 点。 三、选择题(至少选一个,可以多选) 1 / 32 1)面向对象程序设计着重于(B )的设计。 A. 对象 B.类 C.算法 D.数据 (2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机 制叫做( C )。 A. 抽象 B.继承 C.封装 D.多态 3)在面向对象程序设计中,类通过(D )与外界发生关系。

3、 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.

4、数据抽象( 7)下面( A )不是面向对象系 统所包含的要素。 A.重载 B.对象 C.类 D.继承 结果分析】 面向对象 =对象+类+继承+消息 +多态 2 / 32 8)下面说法正确的是( BC )。 A.将数据结构和算法置于同一个函数内,即为数据封装 B. 一个类通过继承可以获得另一个类的特性 C. 面向对象要求程序员集中于事物的本质特征,用抽象的观点看待程序D. 同一消息为不同的对象接受时,产生的行为是一样的,这称为一致性 结果分析】 即为数据封装。同一消息为不同的对象接受 这称为多态性。 面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。将 数据结构和算法置于同一个类内,

5、 时,产生的行为可能是不一样的, 9)下面说法正确的是( AD )。 A.对象是计算机内存中的一块区域,它可以存放代码和数据 B. 对象实际是功能相对独立的一段程序 C. 各个对象间的数据可以共享是对象的一大优点 D. 在面向对象的程序中,对象之间只能通过消息相互通信 结果分析】 对象是计算机内存中的一块区域。在对象中,不但存有数据,而且存有代 码,使得每个对象在功能上相互之间保持相对独立。对象之间存在各种联系, 但它们之间只能通过消息进行通信。 四、判断题 (1)在高级程序设计语言中,一般用类来实现对象,类是具有相同属性和 行为的一组对象的集合,它是创建对象的模板。( ) (2)C+语言只支

6、持面向对象技术的抽象性、封装性、继承性等特性,而 不支持多态性。( ) 3 / 32 结果分析】 C+语言不仅支持面向对象技术的抽象性、封装性、继承性等特性,而且支 持多态性。 3)面向对象程序设计中的消息应该包含 “如何做”的信息。( ) 结果分析】 向对象 “发送消 所以,它们可能 这种现象叫做多 消息是面向对象程序设计用来描述对象之间通信的机制。 息”只需告诉对象做什么,对象根据这个消息决定如何做。 4)一个消息只能产生特定的响应效果。( ) 结果分析】 当一个对象发出消息时,由于接收对象的类型可能不同, 做出不同的反应。这样,一个消息可以产生不同的响应效果, 态。 (5)类的设计和类的

7、继承机制实现了软件模块的可重用性。( )(6) C+语言和 Java语言均不是一个纯正的面向对象的程序设计的语言。 结果分析】 Java语言是一个纯正的面向对象的程序设计语言。 7)学习 C+语言是学习面向对象的程序设计方法的唯一途径。( ) 结果分析】 程序设计方法是独立于具体程序设计语言的一种技术,学习C+语言是学习 面向对象程序设计方法的重要途径之一。 8)在 C+语言中,类是支持数据封装的工具。( ) 五、简答题 4 / 32 1)什么是结构化程序设计方法?它有哪些优点和缺点? 问题解答】 结构化程序设计方法着眼于系统要实现的功能,从系统的输入输出出发, 分析系统要做哪些事情,进而考虑

8、如何做这些事情,自顶向下地对系统的功能 进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复 杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维 护。 随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在 明显的不足之处。首先是数据安全性问题。由于数据被每个模块所共用,因此 是不安全的,一旦出错,很难查明原因。其次是可维护性及可重用性差。它把 数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉 及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新 方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描

9、述和实现,开发和维护也都很困难。 2)什么是面向对象程序设计方法?它有哪些优点? 问题解答】 面向对象的程序设计方法中,将程序设计为一组相互协作的对象而不是一 组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征;行 为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方 法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通 过消息进行通信。程序可表示为: 程序 =对象 +消息 在面向对象程序设计中应着重于类的设计。类正是面向对象语言的基本程 序模块,通过类的设计来完成实体的建模任务。类通过一个简单的外部接口与 外界发生关系。一个类中的操作不会处理到另

10、一个类中的数据,这样程序模块 的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺 序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更 5 / 32 符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问 题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。 (3)结构化程序设计方法与面向对象程序设计方法在对待数据结构和算法 关系上有什么不同? 问题解答】 结构化程序设计方法中,把数据结构和算法分离为相互独立的实体;而在 面向对象程序设计中,数据结构和算法封装在一起,结合成一个独立的单位, 即对象,并尽可能隐蔽对象的内部细节。对象的

11、私有属性只能由这个对象的行 为来读取和修改,与外部的联系通过公有行为充当外部接口。第2章从 C到 C+ 、名词解释 引用 xx 函数重载函数 问题解答】 所谓引用就是给对象取一个别名,使用该别名可以存取该对象。换句话说 是使新对象和原对象共用一个地址。 内联函数是使用 inline 关键字声明的函数。 重载函数指在同一个作用域内名字相同而参数不同的函数。重载函数通常 用来对具有相似行为而数据类型或数据个数不同的操作提供 个通用的名称。 二、填空题 般情况下,用 C+语言编写的程序是由函数加上类组成的。 C+有两种注释符号,一种是 / ,另一种是 /* *。/ 使用 C+风格的输入输出,在程序中

12、必须包含头文件 iostream。” (4) 符。 cin 是预定义的标准输入流对象, 是输入操作符,也称提取运算 6 / 32 (5) cout 是预定义的标准输出流对象, 是输出操作符,也称插入运算 符。 (6)指针的值是它所指向那个对象的地址值。指针的类型是它所指向对象 的类型。指针的内容便是它所指向对象的值。 (7) 象的存取 (8) 行声明。 10) (11) 配的内存。 x=10, C+使用运算符 int main () int x=10, coutx=x,y=yendl; int *p= *p=100; 7 / 32 coutx=x,y=yendl; return 0; 三、选择

13、题(至少选一个,可以多选) 1)在整型指针变量 p2、p3 的定义中,错误的是( A )。 A. int p1,*p2 ,p3; B. int*p2 , p1,*p3; C. int p1,*p2= D. int*p2 , p1,*p3= 指针定义的具体格式如下所示: 结果分析】 类型 *指针名 1,*指针名 2,; 2)若有定义 “double xx=3.1,4 *pp= int main () int num=50; int ref=ref+10; coutnum=numendl; num=num+40; coutref=refendl; 13 / 32 return 0; 输出结果】 n

14、um=60 ref=100 问题分析】本题主要考查引用的含义。 结果分析】 程序首先定义一个 int 类型的对象 num,并给它赋初始值 50。然后又定义 了一个 int 类型的引用 ref ,并将它和 num 相联系。这样,无论是对 num 还是对 ref 进行操作,实际上都是对那个一开始放着 50 的物理单元的内容进行操作。 七、程序设计题 写出一个完整的 C+程序,使用系统函数 pow (x,y)计算 xy的值,注意 包含头文件 cmath。 问题分析】 本题主要考查简单的输入输出和标准库函数的调用方法。 解题思路】 由于要用到系统函数 pow(x,y),所以要包含头文件 cmath。

15、要计算 xy的值,首先必须知道 x和 y的值。为了程序的通用性,最好 通过交互的方式输入 x和 y 的值。 参考程序】 / xt2_1.cpp #include 14 / 32 #include using namespace std; int main () float x , y; coutxy; float z=pow (x,y); coutpow(x,y)=z 6)关于成员函数的说法中不正确的是(C )。 A. 成员函数可以无返回值 B. 成员函数可以重载 C. 成员函数一定是 xx 函数 D. 成员函数可以设定参数的默认值 结果分析】 与普通函数不同的是,成员函数是属于某个类的。成员

16、函数的实现,可以 放在类体内,也可以放在类体外。在类体外实现的成员函数不再是内联函数。 7)下面对构造函数的不正确描述是( B )。 A. 系统可以提供默认的构造函数 B. 构造函数可以有参数,所以也可以有返回值 18 / 32 C. 构造函数可以重载 D. 构造函数可以设置默认参数 结果分析】 构造函数不能指定返回类型,即使是 void 类型也不可以,当然不可能有返 回值。 (8)假定 A是一个类,那么执行语句 “A ,a b(3),*p;”调用了( B ) 次构造函数。 A. 1 B. 2 C. 3 D. 4 结果分析】 声明指针是不会调用构造函数的。 9)下面对析构函数的正确描述是( A

17、C )。 A. 系统可以提供默认的析构函数 B. 析构函数必须由用户定义 C. 析构函数没有参数 D. 析构函数可以设置默认参数 结果分析】 析构函数的作用是在对象消失时执行一项清理任务。如果一个类中没有定 义析构函数,系统将自动生成一个默认析构函数。析构函数没有参数,当然不 可能设置默认参数。 10)类的析构函数是( D )时被调用的。 A. 类创建 B.创建对象 C.引用对象 D.释放对象 19 / 32 ( 11)创建一个类的对象时,系统自动调用( B );撤销对象时,系统自 动调用( C )。 A. 成员函数 B.构造函数 C.析构函数 D.复制构造函数 12)通常拷贝构造函数的参数是

18、( C )。 A. 某个对象名 B.某个对象的成员名 C. 某个对象的引用名 D.某个对象的指针名 13)关于 this 指针的说法正确的是( B )。 A. this指针必须显式说明 B.当创建一个对象后, this 指针就指向该对象 C.成 员函数拥有 this 指针 D.静态成员函数拥有 this 指针。 结果分析】 this 指针是由 C+编译器自动产生且较常用的一个隐含对象指针,它不能被 显式声明。当创建一个对象时, this 指针就初始化指向该对象。但只有非静态成 员函数才拥有 this 指针,并通过该指针来处理对象。 14)下列关于子对象的描述中,( B )是错误的。 A. 子对

19、象是类的一种数据成员,它是另一个类的对象 B. xx对象可以是自身类的对象 C. 对子对象的初始化要包含在该类的构造函数中 D. 一个类中能含有多个子对象作其成员 结果分析】 子对象不可以是自身类的对象。 15)对 new 运算符的下列描述中,( B )是错误的。 A. 它可以动态创建对象和对象数组 20 / 32 B. 用它创建对象数组时必须指定初始值 C. 用它创建对象时要调用构造函数 D. 用它创建的对象数组可以使用运算符 delete 来一次释放 结果分析】 使用运算符 new 创建对象数组的格式如下: new 类型说明符 算术表达式 其中, 算术表达式 给出数组的大小,后面不能再跟构

20、造函数参数,所以 用它创建对象数组时不能指定初始值。 16)对 delete 运算符的下列描述中,( D )是错误的。 A.用它可以释放用 new 运算符创建的对象和对象数组 B. 用它释放一个对象时,它作用于一个 new 所返回的指针 C. 用它释放一个对象数组时,它作用的指针名前须加下标运算符D.用它 可一次释放用 new 运算符创建的多个对象 结果分析】 用 delete 一次只能释放用 new 创建的 1 个对象,但可释放一个对象数组。 17)关于静态数据成员,下面叙述不正确的是(C )。 A.使用静态数据成员,实际上是为了消除全局变量 B. 可以使用 “对象名.静态成员 ”或者“类名

21、静态成员 ”来访问静态数据成员 C. 静态数据成员只能在静态成员函数中引用 D. 所有对象的静态数据成员占用同一内存单元 结果分析】 21 / 32 静态数据成员可以在静态成员函数中引用,也可以在非静态成员函数中引 用。 18)对静态数据成员的不正确描述是( CD )。 A.静态成员不属于对象,是类的共享成员 B. 静态数据成员要在类外定义和初始化 C.调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this 指 针 D.只有静态成员函数可以操作静态数据成员 结果分析】 this 指针是一个局部量,局部于某个对象,而静态成员函数是属于整个类而 不是某个对象,它没有 this 指针。静

22、态成员函数和非静态成员函数均可操作静 态数据成员。 D )。 19)下面的选项中,静态成员函数不能直接访问的是( A.静态数据成员 B.静态成员函数 C. 类以外的函数和数据 D.非静态数据成员 结果分析】 由于静态成员函数没有 this 指针,它只能直接访问该类的静态数据成员、 静态成员函数和类以外的函数和数据,访问类中的非静态数据成员必须通过参 数传递方式得到对象名,然后通过对象名来访问。 20)在类的定义中,引入友元的原因是(A )。 A.提高效率 B.深化使用类的封装性 C. 提高程序的可读性 D.提高数据的隐蔽性 结果分析】 22 / 32 友元的作用主要是为了提高效率和方便编程,但

23、友元破坏了类的封装性和 隐蔽性,使用时要权衡利弊。 21)友元类的声明方法是( A )。 A. friend class类名 ;B. youyuan class类名 ;C. class friend类名 ; D. friends class类名;( 22)下面对友元的错误描述是( D )。 A.关键字 friend 用于声明友元 B. 一个类中的成员函数可以是另一个类的友元 C. 友元函数访问对象的成员不受访问特性影响 D. 友元函数通过 this 指针访问对象成员 结果分析】 友元函数是一个放在类中的普通函数,它没有 this 指针。 23)下面选项中,( C )不是类的成员函数。 A.构造

24、函数 B.析构函数 C.友元函数 D.拷贝构造函数 三、简答题 1)类与对象有什么关系? 问题解答】 类是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种 类型的不仅可以有数据,而且可以有对数据进行操作的函数。程序员可以使用 这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象 时,类被用做样板,对象称为类的实例。 2)类定义的一般形式是什么?其成员有哪几种访问权限? 问题解答】 23 / 32 定义类一般形式为: class类名 public: 公有数据和函数 protected: 保护数据和函数 private: 私有数据和函数 ; 访问权限共有 3 种:分别是公

25、有( public)、保护( protected )和私有 private)。 3)类的实例化是指创建类的对象还是定义类? 问题解答】 指创建类的对象。 4)什么是 this 指针?它的主要作用是什么? 问题解答】 this 指针是 C+语言为成员函数提供的一个隐含对象指针,它不能被显式声 明。this 指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数 时,编译器根据 this 指针来确定应该引用哪一个对象的数据成员。 5)什么叫做拷贝构造函数?拷贝构造函数何时被调用? 问题解答】 24 / 32 拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象 去初始化另一个对

26、象。为了保证所引用的对象不被修改,通常把引用参数声明 为 const 参数。 在以下 3 种情况下,拷贝构造函数都会被自动调用: 当用类的一个对象去初始化该类的另一个对象时; 当函数的形参是类的对象,进行形参和实参结合时; 当函数的返回值是类的对象,函数执行完成返回调用者时。 四、程序分析题(写出程序的输出结果,并分析结果) #include using namespace std; class Test private: int num; public: Test() ;/ 默认构造函数 Test( int n); / 带一个参数构造函数 ; Test Test() coutInit def

27、aendl; 25 / 32 num=0; Test Test(int n) coutInit nendl; num=n; int main () Test x2;/语句 1 Test y(15); /语句 2 return 0; 输出结果】 Init defa Init defa Init 15 问题分析】 本题主要考查构造函数的调用时机和构造函数的匹配问题。 要点提示】 26 / 32 构造函数在创建对象时被自动调用,具体调用哪个构造函数将由编译系统 根据重载函数的匹配原则来确定。 结果分析】 程序声明了 2个对象 x和 y,类中有 2个构造函数。 程序首先执行语句 1,创建对象 x,调用

28、默认构造函数。由于对象 x是 对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调 用了 2次,输出第 1、2行结果。程序接着执行语句 2,创建对象 y,调用带一 个参数的构造函数,输出第 3行结果。 #include using namespace std; class Xx private: int num; public: Xx(int x)num=x; /构造函数 Xx() coutdst numendl; /析构函数 ; int main () Xx w(5); /语句 1 27 / 32 coutExit mainendl; /语句 2 return 0; 输出结果

29、】 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 的无参构造函数 28 / 32

30、Whole(); / Whole 的析构函数 private: Part p1;/ 子对象 Part p2;/ 子对象 Part p3;/ 子对象 ; WholeWhole(int i) :p2( i), p1() coutConstructor of Wholeendl; Whole Whole() coutDestructor of Wholeendl; 输出结果】 Default constructor of Part Constructor of Part, 3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part ,0 29 / 32 Destructor of Part ,3 Destructor of Part ,0 问题分析】 本题主要考查子对象初始化的方法和含有子对象时构造函数和析构函数的 调用顺序。 要点提示】 当建立 X 类的对象时,先调用子对象的构造函数,初始化子对象,然后 才执行 X 类的构造函数,初始化 X 类中的其他成员。 对子对象构造函数的调用顺序取决于这些子对象在类中的说明顺序,与 它们在成员初始化列表中给出的顺序无关。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论