理学面向对象的C++课后答案.docx
《理学面向对象的C++课后答案.docx》由会员分享,可在线阅读,更多相关《理学面向对象的C++课后答案.docx(51页珍藏版)》请在冰豆网上搜索。
![理学面向对象的C++课后答案.docx](https://file1.bdocx.com/fileroot1/2023-1/7/494012d3-729f-4c2e-9b04-71093a5648aa/494012d3-729f-4c2e-9b04-71093a5648aa1.gif)
理学面向对象的C++课后答案
[理学]面向对象的C++课后答案
一、单选题
1(下列各种高级语言中,不是面向对象的程序设计语言的是。
A(C++B(JavaC(CD(Smalltalk
【参考答案】C
【解析】C++、Java、Smalltalk都是面向对象的程序设计语言,而C语言是一种面向过程的程序设计语言。
2(下列关于类与对象关系的描述中,不正确的是。
A(类是具有相同属性和行为的一类对象的抽象
B(对象是类的具体实体
C(类与对象在内存中均占有内存单元
D(类是创建对象的模板
【参考答案】C
【解析】类与对象是一组抽象与具体的关系,类实际上是类型,对象实际上是属于类类型的变量,因此只有变量才会占有内存空间,类型不占内存空间。
3(下列哪一个不是面向对象方法的特征。
A(开放性B(封装性C(继承性D(多态性
【参考答案】A
【解析】封装性、继承性和多态性是面向对象方法的三大特征。
4(C++源程序文件的扩展名是。
A(.objB(cppC(exeD(c
【参考答案】B
【解析】C++源程序的扩展名为cpp,而C语言源程序的扩展名为c,C++和C语言源程序经
编译后生成的目标文件扩展名为obj,链接后的可执行文件扩展名为exe。
5(下列关于对象的描述中,不正确的是。
A(对象是现实世界中客观存在的某种实体
B(对象是类的实例
C(对象就是C语言中的结构体变量
D(对象是属性和行为的封装体
【参考答案】C
【解析】现实世界由一个个对象构成,因此对象是现实世界中客观存在的实体;根据对象与类之间的关系,对象是类的实例,是属性和行为实际的封装体。
对象所属的类类型是一种新类型,与结构体类型有区别,因此对象不是结构体变量。
二、填空题
1(C++语言既支持的程序设计,又支持的程序设计。
【参考答案】面向过程、面向对象
【解析】C++语言在C语言的基础上扩充,是带类的C,是同时支持面向过程程序设计和面向对象程序设计的混合型语言。
2(开发C++程序应该包括的4个步骤依次是:
、、和。
【参考答案】编辑、编译、链接、运行
【解析】开发C++程序与开发其他高级语言的程序一样,包括编辑、编译、链接和运行几个步骤。
3(C++源程序和C源程序一样,有且仅有1个函数。
【参考答案】main
【解析】main()函数作为操作系统调用用户程序的入口,必须有且只能有一个。
4(在VC++6.0环境中,C++程序无论是单文件还是多文件,都应该在一个下管理。
【参考答案】项目
【解析】C++程序可以是单个文件,也可以有多个文件。
在VC++6环境下,都要在项目中管理程序。
5(VC++6.0集成开发环境中的几乎可以帮助找到程序开发中可能产生的所有错误。
【参考答案】调试器
【解析】调试器是VC++6系统中最出色的组件之一,它几乎可以帮助找到程序开发中可能产生的所有错误。
三、问答题
1(简述C++语言与C语言的关系。
【参考答案】C++语言在传统C语言的基础上进行改造和扩充,引入了面向对象的概念和方法,增加了对面向对象程序设计的支持。
C++语言是同时支持面向过程程序设计和面向对象程序设计的混合型语言。
在支持面向过程的程序设计方面,C++语言首先继承了C语言,与C语言兼容,C语言是C++语言的一个子集。
C语言的词法、语法和其他规则都可以用到C++语言中。
但同时,C++语言又针对C语言的某些不足做了改进。
例如,用流更方便地实现输入/输出操作;用const定义常量取代宏;允许函数重载、函数带有默认形式参数值;增加了引用;提供了更方便的动态内存空间管理方法;提供了异常的检查、处理机制,提高了程序的健壮性等。
C++语言具有C语言无法比拟的优越性,因为它同时支持面向对象的程序设计,支持封装性、继承性和多态性,使得程序更安全、代码可重用性更高、可维护性更强,因而成为目前应用最为广泛的高级程序设计语言。
2(简述面向对象方法所具有的三个特征。
【参考答案】面向对象的程序设计方法所具有的三个特征是封装性、继承性和多态性。
封装性是面向对象程序设计的第一大特征。
封装指将数据和处理这些数据的过程结合成一个有机的整体—类,通过定义类实现封装,而封装的实际单位是属于类的对象。
封装机制使对象将非public成员以及接口函数实现的内部细节隐藏起来,并能管理自己的内部状态。
外部只能从对象所表示的具体概念、对象提供的服务和对象提供的外部接口来认识对象,通过向对象发送消息来激活对象的自身动作,实现一定的功能。
封装性使得面向对象程序设计具有高安全性和可靠性。
继承性是面向对象程序设计的第二大特征,是面向对象的程序设计提高代码重用性的重要措施。
继承表现了特殊类与一般类之间的上下分层关系,这种机制为程序员提供了一种组织、构造和重用类的手段。
继承使一个类(称为基类或父类)的数据成员和成员函数能被另一个类(称为派生类或子类)重用。
在派生类中只需增加一些基类
中没有的数据成员和成员函数,或是对基类的某些成员进行改造,这样可以避免公共代码的重复开发,减少代码和数据冗余。
多态性是面向对象程序设计的第三大重要特征。
面向对象程序设计的多态性指一种行为对应着多种不同的实现。
多态性有静态多态性(也称为编译时的多态性)和动态多态性(也称运行时的多态性)两种。
静态多态性通过函数重载和运算符重载来实现,动态多态性需要继承、虚函数、基类的指针或引用来实现。
多态性使得同一个接口可以实现不同操作,大大方便了使用者。
3(如何理解面向对象的程序设计体现为类的设计和类的使用这两大过程,
【参考答案】面向对象的程序设计,通过定义类的对象,再向对象发送消息使其产生相应的响应来实现程序的功能,这体现的是对类的使用。
但由于对象属于类,对象可以有哪些数据成员来
表达其静态特性,可以执行哪些成员函数以实现其动态特性,实际上都取决于类的设计,因此在面向对象的程序设计中,最富挑战性和创造性的工作首先是类的设计。
类的设计还体现在通过继
承与派生机制定义新的类,进而可以定义新类的对象完成程序的功能。
因此,面向对象的程序设计体现为类的设计和类的使用两大过程。
4(如何在VC++6.0中获取帮助信息,
【参考答案】程序员可以通过按F1得到上下文帮助。
例如,在编辑文件时按F1可以得到有关编辑的帮助,在编译连接错误信息上按F1可以得到关于该错误的帮助信息。
还可以通过选择
菜单Help|Contents来启动MSDN查阅器,MSDN查阅器是一个功能强大的程序,可以方便地浏览、查找信息。
5(简述在VC++6.0中开发C++程序的全过程。
【参考答案】开发C++程序包括编辑、编译、链接和运行几个步骤。
在VC++6.0中开发C++程序主要也由上述过程组成。
由于VC++6.0以项目管理程序,所以对于多文件结构的程序,首先要建立一个项目,而单文件结构的程序可以省略此步,在编译时自动建立项目文件。
(1)编辑源文件。
利用VC++6.0的编辑器可以进行源文件的编辑工作,生成扩展名为.cpp的源程序文件。
(2)编译链接源文件。
对编辑完成的文件需要进行编译和链接,在VC++6.0下这两步可以合在一起完成,方法是选择主菜单Build下的Build二级菜单,或选择工具栏上对应的工具按钮,如果编译链接正确,则在下面的输出窗口中显示“0errers0warnings”否则,将显示错误或告警信息,需要回到编辑状态重新修改,直到编译链接正确。
(3)运行可执行文件。
在生成了.exe可执行文件步骤完成后,就可以运行程序了。
运行程序的方法很多,在集成环境下,可以选择主菜单Build下的Execute二级菜单,或直接单击Build工具栏中的“~”按钮,则运行结果输出显示在DOS窗口的屏幕上。
如果运行结果不正确,则可以启用
调试器,找出问题所在,再重新修改源程序,编译链接后再运行。
第2章C++语言对C语言的改进及扩展
一、单选题
1(下列语句中错误的是。
A(intn=5;inty[n];
B(constintn=5;inty[n];
C(intn=5;int*py=newint[n];D(constintn=5;int*py=newint[n];【参考答案】A
【解析】定义一维数组时,一定要用常量指明数组变量所含分量个数,A答案中的n是一个已赋值的变量而不是常量,故不能用来表示y数组所含分量个数。
答案B中的n是一个用const定义的符号常量,故正确。
在利用指针申请动态一维数组空间时,元素个数既可以是常量也可以是变量,因此答案C和D都是正确的语句。
2(以下设置默认值的函数原型声明中错误的是。
A(intadd(intX=3,inty=4,intZ=5);B(intadd(intx,inty=4,intz);C(intadd(intx,inty=4,intz=5);D(intadd(intx,inty,intz=5);【参考答案】B
【解析】函数的形式参数提供默认值必须按从右到左依次的要求,显然答案B是错误的。
答案A中所有的形式参数都有默认值,正确;答案C中右边两个形式参数都有默认值,也是正确的,答案D中只有最右边一个形式参数有默认值,左边两个形式参数都没有默认值,符合从右到左依次提供默认值的要求,也是正确的。
3(下列不正确的重载函数是。
A(intprint(intX);和voidprint(floatX);B(intdisp(intX);和char*disp(intY);C(intshow(intX,char*s);和intshow(char*s,intX);D(intview(intX,inty);和intview(intX);【参考答案】B
【解析】根据函数重载的要求,同名函数在形式参数的个数、类型、顺序的一个或多个方面有区别才是正确的重载,函数返回值类型不作为重载的条件。
此题中,答案A在形式参数的类型上不同;答案C在形式参数的顺序上不同;答案D在形式参数的个数上不同,它们都符合函数重载
的条件。
答案B仅在返回值类型上不同,因此不是正确重载。
4(下列语句中错误的是。
A(int*p=newint(10);B(int*p=newint[10];C(int*p=newint;D(int*p=newint[40](0);【参考答案】D
【解析】根据利用new申请动态空间的用法,用new可以申请一个单位的动态空间,也可以申请一组连续的动态空间实现动态一维数组。
答案A表示在申请一个动态空间的同时向这一空间中赋入值10,此句相当
于int*p=newint;*p=10;语句;答案B表示申请连续10个int型动态空
间构成含有10个分量的动态一维数组;答案C表示申请了一个int型动态空间,但未向该动态空间中写入确定内容。
答案D的错误在于试图在申请动态一维数组的同时为每一个元素赋以相同的初值,这种用法C++不支持,因此是错误的。
5(假设已有定义constchar*name="chen";,下面语句中错误的是。
A(name[3]='a';B(name="lin";
C(name=newchar[5];D(cout<
【参考答案】A
【解析】根据const与指针的结合内容,以上定义的name指针为指向常量的指针,此时name所指向的内容是常量,但是name指针本身是变量,因此可以被重新赋值,也可以利用它重新申请空间,故答案B和C都是正确的语句;答案D是输出内容,不涉及指针或其指向内容的改变,因此肯定正确;答案A试图修改指针所指向的内容,故错误。
二、填空题
1(用C++风格的输入/输出流进行输入/输出处理时,必须包含的头文件是。
【参考答案】iostream.h或者名空间std中的文件iostream【解析】使用C++的流控制方法进行输入/输出操作时,需要重点掌握以下要点“必须用#include
及usingnamespacestd;或用#include作文件包含”。
2(在C++语言的异常处理机制中,语句用于抛出异常;语句块用于检测异常;语句块用于捕捉和处理异常。
【参考答案】throw、try、catch
3(C++语言提供了专门用于表达逻辑型的数据类型,这种类型有两个常量分别用关键字是和表示,分别代表和。
【参考答案】bool、true、false、逻辑真、逻辑假
4(在动态内存空间管理方面,C++语言用运算符取代了C语言中的malloc进行动
态内存空间的申请,用运算符取代了C语言中的free释放动态内存空间。
【参考答案】new、delete
5(为提高安全性,C++语言可以用来代替C语言中用宏定义符号常量,可以用
来代替C语言中不安全的带参数的宏。
【参考答案】const定义符号常量、内联函数
三、问答题
1(C++中的同名全局变量通过何种方式可以在同名局部量所在的函数内进行访问,
【参考答案】C++语言中,在同名局部量所在的函数内,通过在同名变量前加上域解析符“:
:
”
对被隐藏的同名全局变量进行访问。
2(如果在程序中,我们只用new进行动态内存空间分配,而忘记用
delete来释放,会产生什么样的后果,使用new和delete动态申请和释放内存空间,有什么好处,
【参考答案】C++语言中,在用new或new[]申请了动态内存空间后,一旦这部分动态内存空间使用结束,一定要及时使用delete或delete[]释放空间,如果忘记用delete释放,则会产生内
存垃圾,影响程序的正常运行,还有可能导致死机。
使用new和delete动态申请和释放内存空间,其好处首先表现在使用形式比malloc、calloc、free要简洁。
更重要的是,使用new和delete可以正确地使用C++语言中一些重要技术,例如,面向对象程序设计中的构造函数与析构函数等。
3(函数被说明为内联函数后,对哪些开销有影响,【参考答案】函数被说明为内联函数后,对空间和时间开销均有影响。
空间方面:
调用内联函数时,编译器对其进行扩展,即用内联函数体的代码替换掉内联函数调用语句,故代码区所需空间会更大一些;但是调用内联函数避免了调用一般函数时将程序当前的一些状态信息存到栈中所需要的空间开销。
时间方面,节省了时间开销。
因为调用内联函数时不需要转到函数的代码处去执行函数体语句,再返回到调用点等,这些传递过程所需要的时间开销节省了。
总的来说,内联函数是一种用空间换时间的措施,故内联函数代码不能过长,否则将失去其优势。
四、读程序写结果
1(当从键盘上输入23.561090<回车>时,写出下面程序的运行结果。
#include"iostream.h"
voidmain()
{inta,b,c;
charch;
cin>>a>>ch>>b>>c;
cout<【参考答案】23
56
10
【解析】根据C++输入流读入数据的方法,当读入23.56时,因为第1个接受变量a定义为int型,因此当遇到.时自动认为第1个整数23输入结束,接下来的.自然读入到字符型变量ch中,接下来的56读入到变量b中,而10读入到变量C中,90是多余的输入被忽略。
2(写出下面程序的运行结果。
#include
usingnamespacestd;
voidmain()
{intarr[4]={1,2,3,4};
int*a=arr;
int*&p=a;//p是一个指针引用
p++;
*p=100;
cout<<*a<<""<<*pcout<intb=10;
p=&b;
cout<<*a<<""<<*pcout<}
【参考答案】100100
110034
1010
110034
【解析】此题考查利用指针间接访问一维数组元素、普通变量的
值,以及引用是其所代表的变量别名的含义。
此题中,a一开始是
一个指向数组空间的指针,p是一个引用,是a的别名,因此,
p++实际上就是a++,对*p的赋值就是对*a的,也就是arr[1]元素的
赋值,因此,*p、*a和arr[1]的输出值相等。
p=&b实际上就是a=&b,
因此,*p和*a的输出值都是b的值。
3(写出下面程序的运行结果。
#include
usingnamespacestd;inti=0;
voidmain()
{inti=5;
{inti;
i=7;
cou