c++程序设计实践教程答案及辅导.pdf
《c++程序设计实践教程答案及辅导.pdf》由会员分享,可在线阅读,更多相关《c++程序设计实践教程答案及辅导.pdf(136页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1章引 论一、基本内容机器语言?汇编语言?高级语言?元语言?编译连接?早期绑定?晚期绑定?面向对象的设计步骤?封装?重载?多态?继承?抽象?程序结构与组织?本章对面向对象的有关概念不要求完全掌握?二、学习要点机器语言是一种计算机自身可以识别的语言?机器语言程序是由机器指令和数据形成的二进制文档?机器语言指令通常由操作码和地址码构成?机器语言程序难于理解?编程繁琐?不易维护?汇编语言是一种符号化的能直接将汇编指令翻译为机器指令的程序设计语言?汇编语言和机器语言同为低级语言?汇编语言更易理解和用于编程?但它仍然是一种面向机器的低级程序设计语言?高级语言程序是一种以类似于自然语言形式描述指令及数据
2、的程序设计语言?高级语言程序经编译可生成低级语言程序?高级语言通常指是面向过程的程序设计语言?即描述的是问题求解的过程?算法或方法?问题求解的常用手段是功能分解?面向对象的程序设计语言是一种能对新类型描述其属性和操作的高级语言?同时为新类型的定义提供了重载?封装?多态?继承?组成等描述机制?元语言是一种用来描述其他语言的语言?其特点是描述准确严格?抽象程度高?常用的描述程序设计语言的元语言是BNF语言?编译程序是用来将高级语言翻译为低级语言的程序?反编译程序是用来将低级语言翻译为高级语言的程序?程序设计语言的翻译方式通常有两种?即解释方式和编译方式?C+一般采用编译方式?高级语言程序通常要经过
3、预处理?词法分析?语法分析?代码生成和模块连接等环节?才能被编译成可被计算机执行的程序?绑定(binding)就是将函数的入口地址同函数调用指令的地址码相联系的过程?绑定就是要计算被调用函数的入口地址?并将该地址存放到函数调用指令的地址码部分?绑定分为静态绑定和动态绑定两种形式?通常又叫早期绑定和晚期绑定?静态绑定在程序执行前完成?由编译程序或操作系统的装入程序计算函数的入口地址?动态绑定则在程序执行过程中完成?由应用程序自身计算函数的入口地址?面向对象的技术八十年代初开始出现?SMALLTALK?C+?JAVA?C#等是较为著名的C+程序设计实践 教 程 254面向对象的程序设计语言?C+在
4、20世纪80年代初出现?直到1983年C+的名字才正式确定下来?1986年?Bjarne Stroustrup在美国AT&T的贝尔实验室开发了C+?面向对象的设计要经历系统分析?系统设计?对象设计与对象实现等四个阶段?每个阶段之间的界限不是十分明显?这种早期模型和晚期模型的一致性?使面向对象的技术能更好地支持快速原型法?封装是将对象的“属性”和 方法”包装在一起?并对外部提供不同权限的访问接口的机制?重载是指用同名的操作针对不同的类型完成不同的功能?重载是多态的一种特例?重载又称为编译时多态?多态则特指运行时多态?多态是指同名的操作针对不同的类型表现出不同的行为?继承是指一种类型接受并利用另一
5、种类型的属性和操作的机制?继承可以分为取代继承?包含继承?受限继承和异化继承等多种方式?抽象是指一种从事物实例得到事物的共同属性和操作从而形成事物类型描述的过程?或从若干低级的事物类型不但提炼形成高级或更具普遍意义事物类型描述的过程?C+程序是一种由变量?过程或函数以及类型描述构成的混和结构的程序织?因此?从这个意义上说?C+不是一种纯的面向对象的程序设计语言?三、习题答案1.1 高级语言程序经过哪些阶段才能成为可执行程序?解:高级语言程序通常要经过预处理?词法分析?语法分析?代码生成和模块连接等阶段?才能被编译成可被计算机执行的程序?1.2 什么叫静态连接?什么叫动态连接?它们有什么区别?解
6、:静态连接是由编译程序完成的?编译程序将编译生成的目标语言连接成可执行程序文件的过程?动态连接是由操作系统完成的?在应用程序执的行过程中?操作系统根据被调用的函数名连接内存中的动态连接库函数?若相关动态连接库被移出内存?则重新装入动态连接库并重新连接?静态连接是在程序执行之前完成的?动态连接是在程序的执行过程中完成的?静态连接程序在执行时不需要再次装入程序文件?动态连接程序在执行时一般需要重新装入程序文件?因此?静态连接程序一般来说比动态连接程序执行速度快?静态连接程序需要将程序文件全部装入内存?如果不同的程序包含了同样的函数代码?就会在内存装入这些函数的多个副本?动态连接程序总是共用同一个函
7、数副本?因此?静态连接程序一般要比动态连接程序占用更多的内存?1.3 什么叫静态绑定?什么叫动态绑定?它们有什么区别?解:静态绑定是在程序运行之前进行的?编译程序或操作系统在装入程序后?计算函数的习 题 答 案 255入口地址?并将该地址填写到相应的函数调用处?动态绑定是程序运行之中完成的?应用程序在执行过程中?激活由编译程序生成的?通过静态或动态方式连接的一段代码?计算函数的入口地址并填写到相应的函数调用处?两者的区别在于:静态绑定在程序执行之前完成?由编译程序或操作系统计算函数的入口地址?动态绑定在程序运行之中完成?由应用程序自己计算函数的入口地址?1.4 什么叫封装?提供封装机制有什么好
8、处?解:封装是将对象的“属性”和“方法”包装在一起?并对外部提供不同权限的访问接口的机制?提供封装机制的好处在于:?1?通过封装对象的“属性”和 方法”?为对象定义了系统边界?2?在保持封装接口不变的情况下?可以改变对象的内部结构?而不会影响对象的外部特性?从而为对象进化提供了方便?3?由于封装屏蔽了对象“方法”的细节?从而保证核心算法不被泄露?有助于保护软件开发机构的知识产权?1.5 什么叫包含继承?什么叫受限继承?解:包含继承是一种派生类对象完整继承所有基类“属性”和“操作”?并且增加自己的“属性”和“操作”的继承方法?受限继承是一种派生类对象部分继承基类“属性”和“操作”?并且不增加新的
9、“属性”和“操作”的继承方法?1.6?+语言有何特点?解:?1?C+是?语言的超集?继承了?语言的代码质量高?运行速度快?可移植性好等特点?2?+是一种强类型的语言?这使得开发人员在编译阶段就能发现?+程序的潜在错误?3?+的表达能力由于多继承特性?丰富的运算符及运算符重载机制而远远强于其他面向对象的语言?4?C+通过函数模板和类模板提供了更高级别的抽象能力?从而进一步提高了C+的表达效率?5?C+提供了面向对象的异常处理机制?从而使程序更加易于理解和维护?并为局部对象提供了自动析构等有效手段?从而可避免因局部对象未析够而造成的资源泄露?包括内存泄露?6?C+的名字空间解决了不同机构的软件模块
10、的标示符同名冲突问题?从而为大型软件的开发和软件容错提供了有效手段?7?在对象的内存管理方面?C+提供了自动回收和人工回收两种方式?这是开发高效率的系统软件所必需的?但另一方面却容易出错且难于掌握?8?C+程序是由类?变量和模块混合构成?不象JAVA那样完全由类构成?1.7 应当怎样组织?+的程序?解:一个程序由包含文件?类程序文件?函数程序文件等多种文件构成?根据程序所用的库函数?收集要包含的标准头文件?将其加入到自己定义的包含文件中?自定义的包含文件供所有程序文件使用?该文件包含类型?变量?函数的说明信息而非C+程序设计实践教程256定义信息?类程序文件是指包含了成员函数函数体定义的文件?
11、而不是仅包含成员函数原型的说明信息文件?函数程序文件是指包含了函数头及其函数体定义的文件?而不是仅包含函数原型的说明信息文件?如果变量?函数不为整个程序所共享?则将它们定义为局部变量和函数?习 题 答 案,257 第2章C+的变量、类型及函数一?基本内容声明?定义?左值?右值?变量定义?匿名变量?只读变量?挥发变量?类型解释?枚举类型?引用类型?函数原型?函数重载?编译换名?缺省参数?省略参数?调用开销?函数内联?二?学习要点声明是指对变量?函数和类型的不完整描述?定义是指对变量?函数和类型的完整描述?一个变量?函数和类型标识通常可以声明多次?但只能定义一次?变量声明通常只描述变量的类型和名称
12、?但不分配内存或进行初始化?函数声明只说明函数的函数名?参数类型和返回类型?不说明函数的函数体?类型声明通常只说明类型名不描述类型体?主要指class?struct?union等类类型?例如?类名的前向引用声明?C+的变量定义比C 自由?C 的变量定义必须出现在函数前或语句前等固定位置?而变量定义的初始化很少能用任意表达式?C+的变量定义位置几乎没有限制?变量定义的初始化时可以用任意表达式?任意表达式指左值或右值表达式?左值表达式是指能出现在等号左边的表达式?大部分变量都能出现在等号左边?因而单个变量通常可以做左值表达式?函数调用如果返回值引用类型?则通常也可以出现在等号左边?因此?返回引用类
13、型的函数调用也可作左值表达式?此外?C+的前置+和一运算和赋值运算表达式也是左值表达式?当然?运用运算符重载技术?几乎任何包含对象运算的表达式都可定义为左值表达式?例如?对象加法运算表达式是右值表达式?但可以重载为左值表达式?只是习惯上不能这样做?右值表达式是指能出现在等号右边的表达式?所有的表达式都是右值表达式?包括单个变量?函数调用和由运算符构成的任何表达式?因此?左值表达式也是右值表达式?即出现在等号左边的表达式一定能出现在等号右边?反之?右值表达式不一定是左值表达式?C+的变量定义虽然比C 自由?但在定义自动变量时尤其自动数组变量时?最好按照C的定义方法定义?否则可能付出较大的空间代价
14、?全局变量的初始化通常由开工函数完成?C 程序没有开工函数和收工函数?一个C+程序编译通常由三个部分构成:开工函数?main函数?收工函数?因此?即使main函数函数体为空?开工函数或收工函数也可能运行并产生输出结果?开工函数和收工函数是由编译程序生成的匿名函数?因而是不可访问或调用的?当应用程序开始运行时?首先执行开工C+程序设计实践教程258函数?然后执行main函数?最后执行收工函数?开工函数主要完成全局变量的初始化和全局对象的构造?收工函数主要负责全局对象的析构?在对变量进行初始化时?如果初始化表达式的类型与变量的类型不符?则编译程序通常会产生匿名变量?匿名变量由于没有变量名?其值当然
15、是不可访问的?只读变量用const说明?必须在定义的同时立即初始化?之后不能改变只读变量的值?函数的参数和返回类型也可以是只读的?只读参数的初始化在函数调用时传递值?如果实参的类型和形参类型不同?同样也可能产生匿名变量?在一般情况下?函数的返回类型缺省是只读的?例如int f()就相当于const int f()?需要注意的是?int&g不等价于const int&g()?前者的函数调用是一个左值?即可以出现这样的表达式g(4?而后者的函数调用是一个右值?挥发变量用volatile说明?多用在多任务环境做信号灯?以便进行P-V操作之类的协同处理?挥发变量是指本程序?本进程或本线程没有修改其值但
16、其值在自主变化的变量?出现这样的情况显然是因为另外的程序?进程或线程在操作?在进行类型解释时?必须按照运算符的优先级和结合性解释?即首先解释优先级较高的运算符?在优先级相同时按结合性规定的顺序解释?在定义类型时?用到的运算符包括星号*?括号()?数组下标口以及以后还要介绍的成员指针运算符?显然?函数原型int(char)等价于函数原型intf(char)?枚举类型用enum说明?在编译后通常翻译为整型?因此?枚举类型也是简单类型?在缺省情况下?枚举元素的整型值通常从零开始?下一个元素依次增1?枚举元素不能重复?其整型值也可以设定?且整型值可以重复?例如?enum WEEKDAY Sun,Mon
17、=l,Tue,Wed,Thu,Fri,Sat?引用类型用&说明?在编译后翻译为指针?逻辑上?引用变量并不分配存储单元存储变量的值?每次对引用变量的操作都转化为被引用变量的操作?引用变量在定义时必须立即初始化?左值引用变量必须用左值表达式初始化?右值引用变量可用左值或右值表达式初始化?如果初始化表达式的类型和引用变量不符?则可能先产生类型相符的匿名变量?然后用初始化表达式初始化匿名变量?并用匿名变量初始化引用变量?函数参数和返回类型都可以定义为引用类型?函数调用传递实参初始化引用参数时也可能产生匿名变量?右值引用变量是指const类型的引用变量?例如?const int&x=3?函数原型用于描述
18、函数名?函数参数及其类型以及函数的返回类型?C+不允许出现函数名及参数类型一一对应相同而仅返回类型不同的函数原型?函数名相同而函数原型不同的函数称为重载函数?C+编译程序允许使用overload定义重载函数?但现在的编译程序一般都能自动识别重载函数?不需要使用overload定义重载函数?编译程序在将变量名和函数名编译为低级语习 题 答 案259言标识符时?采用了与C编译程序不同的名称转换策略?因此?如果不采用extern C”int x形式的说明?就无法和C程序连接并访问其变量或函数?根据C+编译程序的换名策略?函数名在转换为低级语言函数名时?是由C+函数名外加参数类型等信息构成的?这种策略
19、巧妙地解决函数重载及重载函数的调用问题?传递不同类型的实参将导致直接调用低级语言相应的函数?函数可以定义缺省参数?即调用时若不传递实参?将使用参数缺省值作为实参?函数也可以定义省略参数?省 略 参 数 用”表示?表示0至任意个任意类型的参数?在stdio.h中?定义了两个典型的省略参数的函数?其中printf的函数原型为:intprintf(constchar*,)?表示printf可以打印任意个数的值?在调用一个函数?通常要通过压栈来传递参数的值?调用完毕要清除栈顶的内容以保持栈指针在调用前后是相同的?因此?除非调用嵌套的层次无比深?或者出现了无穷递归调用?否则?用高级语言编写的程序是不会轻
20、易出现栈溢出的?其实?用汇编语言编写程序?也可采用这种保持调用前后栈平衡的策略?调用时的压栈出栈不是函数体所定义的有效计算?这些有效计算之外的额外指令称为调用开销?当函数体很小时?调用开销就显得非常之大?函数内联可以消除调用开销?提高程序的执行效率?通过直接将函数体所定义的计算指令插入到函数调用处?函数内联避免了函数调用从而消除了调用开销?由此可见?当函数体较长时?内联将会大大增加程序的长度?反而不会有什么好处?函数内联用inline说明?但并是加上inline就能内联成功?内联成功的前提是:(1)内联函数的定义必须出现在函数定义之前?2?函数体不能出现if?switch?for?while?
21、do?:和函数调用等分枝转移类型的语句?(3)不能出现取内联函数地址之类的指令?内联使函数的作用域局限于当前程序文件?因此全局的即非static的main函数是不能内联的?另一方面?操作系统必须通过函数调用调用main函数?三?习题答案2.1 若给出声明:char c,*pqconst char cc=a;const char*pcc;char*const cpc=&c;const char*const cpcc=&cc;char*const*ppc;则下面的赋值哪些是合法的?哪些是非法的?为什么?(1)U C C;(1 0)*PG=ABCD2;C+程序设计实践教程260(2)(c=c;(11
22、)(c=a;(3)pcc=&c;(12)*cpc=*pc;(4)pcc=&cc;(13)pc=*pcpc;(5)pc=&c;(14)*pcpc=*pc;(6)pc=&cc,(15)*pc=*pcpc;(7)pc=pcc;(16)*pcc=rb*;(8)pc=cpcc;(17)*pcpc=c,;(9)cpc=pc;(18)*cpcc=,d;解:(1)合法?c不是const类型的变量?可以赋值?(2)非法?cc是const类型的变量?不能赋值?(3)合法?pcc不是const类型的指针变量?可以指向非const类型的字符变量?(4)合法?pcc不是const类型的变量?赋值后指向的cc的类型为co
23、nst char?同其要求指向的类型一致?(5)合法?pc不是const类型的指针变量?赋值后指向的c的类型为char?同其要求指向的类型一致?(6)非法?pc要求指向char类型的变量?不能用const char*类型的&c赋值?(7)非法?pc要求指向char类型的变量?不能用指向const char*类型的pcc赋值?(8)非法?pc要求指向char类型的变量?不能用指向const char*类型的cpcc赋值?(9)非法?cpc是const类型的变量?不能赋值?(10)合法?pc指向的是非const类型的变量?可以赋值?等价于*pcC?(11)非法?cc是const类型的变量?不能赋值
24、?(12)合法?cpc指向的是非const类型的变量?可以赋值?(13)合法?pc是非const类型的指针变量?可以用char*类型的值*pcpc赋值?(14)合法?*pcpc代表的是非const类型的字符变量?可以任何字符类型的值赋值?(15)合法?*pc代表的是非const类型的字符变量?可以任何字符类型的值赋值?(16)非法?*pcc代表的字符是const类型的字符变量?不能赋值?(17)非法?*pcpc代表的是const类型的指针变量?不能赋值?(18)非法?*cpcc代表的是const类型的只读变量?不能赋值?2.2 头文件string.h定义了函数原型char*strcat(cha
25、r*dest,const char*src)?定义函数strcat的函数体?使其将src指示的字符串添加到dest指示的字符串的后面?并将调用时dest的值作为函数的返回值?解:注意strcat的返回值和传入第一个参数的值相同?char*strcat(char*dest,const char*src)char*temp=dest;习 题 答 案-261 while(*lemp)temp+;whi le(*(temp+)=*(src+);return dest;)2.3 C按优先级和结合性解释类型?下述声明是什么意思?(1)typedef void VF_PC_RI(char*,int&)(2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 程序设计 实践 教程 答案 辅导
限制150内