《程序设计教程--用C++语言编程》第四次印刷的勘误表.doc
《《程序设计教程--用C++语言编程》第四次印刷的勘误表.doc》由会员分享,可在线阅读,更多相关《《程序设计教程--用C++语言编程》第四次印刷的勘误表.doc(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序设计教程用C+语言编程第四次印刷的勘误表pIX. 第17行错:8.3 虚函数对:8.3 消息(成员函数调用)的动态绑定p33. 第18行错:上述操作符的含义是:如果“#=”代表上面的复合操作符,则a #= b按照a = a # b理解。对:上述操作符的含义是:如果“#=”代表上面的复合操作符,则a #= b按照a = a # (b)理解。p118. 倒数第5行(注意格式对齐)错: cout fib(8)cout , count endl;return 0;对: cout fib(8);cout , count endl; return 0;p142. 倒数第4行错:由小到大排个序,则在查找
2、时,可以采用一种较快的查找算法:折半查找(或称二分法)。对:由小到大排个序,则在查找时,可以采用一种较快的查找算法:折半查找(或称二分法查找)。p163. 第13行错:当然,在上面的函数max中,也可以用“*xi”的形式访问数组元素。对:当然,在上面的函数max中,也可以用“xi”的形式访问数组元素。p170. 第2个图错:p a head a1 a2. an NULL对:p a head a1 a2. an NULLp226. 倒数第6行错:void f() . void g(int i) . 对:void f() h(); . void g(int i) x = i; . p251. 第1
3、0行错:private;用于给出在派生类中新定义的成员和对基类一些成员的重定义。对:private;用于给出在派生类中新定义的成员,其中包括对基类一些成员的重定义(参见8.3.2节中的虚函数)。p251. 倒数第16行错:(1)派生类除了拥有基类的所有成员(基类的构造函数和赋值操作符重载函数除外)外,也可以具有新的成员。例如,对于上面的派生类B,它除了拥有基类A的成员:x、y、f和g外,它还包含了新的成员z和h,对一个B类的对象,其内存安排和操作如下:对:(1)派生类除了拥有新定义的成员外,还包含了基类的所有成员(基类的构造函数和赋值操作符重载函数除外)。例如,对于上面的派生类B,它除了拥有新
4、的成员z和h外,还包含了基类A的成员x、y、f和g。对B类的一个对象b,其内存安排和操作如下:p251. 倒数第9行错:(2)派生类的定义用于描述派生类与基类的差别。派生类中可以给出新的成员,也可以对基类的成员进行重定义。如果在派生类中对基类的某个成员进行了重定义,则在派生类中对该成员的访问是针对派生类中重定义的成员。例如:对:(2)如果在派生类中定义了与基类成员同名的成员,则在派生类中对该名字的访问是指派生类中新定义的成员。例如:p252. 第9行错:(3)派生类成员名的作用域嵌套在基类作用域中。对于基类的一个成员,如果派生类中没有定义与其同名的成员,则该成员名在派生类的作用域内可见,否则,
5、该成员名在派生类的作用域内不直接可见,如果要使用之,必须用基类名受限。例如:对:(3)派生类成员名的作用域嵌套在基类作用域中。对于基类的一个成员,如果派生类中没有定义与其同名的成员,则该成员名在派生类的作用域内可见,否则,该成员名在派生类的作用域内不直接可见(被隐藏了,hidden),如果要使用之,必须用基类名受限。例如:p253. 倒数第3行错:在派生类中定义新的成员或对基类的成员重定义时,往往需要用到基类的一些private成对:在派生类中定义新的成员或对基类的成员重定义时,往往需要用到基类的一些private成p255. 第19行错:给基类对象的消息也能发给派生类对象,以及基类的对象标识
6、可以标识派生类对象。例如,假对:给基类对象的消息也能发给派生类对象,以及在需要基类对象的地方可以用派生类对象去替代。例如,假p261. 第1行错:8.3 虚函数对:8.3 消息(成员函数调用)的动态绑定p261. 第711行,交换(2)和(3)的次序,并作一些文字修改错:(2)消息的多态。一个可以发送到基类对象的消息,也可以发送到派生类对象,从而可能会得到不同的解释。(3)对象标识的多态。基类的指针或引用可以指向基类对象,也可以指向或引用派生类对象,即一个对象标识符可以属于多种类型,可以标识多种对象。在对象标识符定义时指定的类型称为它的静态类型,而在运行时它实际标识的对象的类型称为它的动态类型
7、。对:(2)对象标识的多态。基类的指针或引用可以指向或引用基类对象,也可以指向或引用派生类对象,即一个对象标识符可以属于多种类型,它可以标识多种对象。在对象标识符定义时指定的类型称为它的静态类型,而在运行时它实际标识的对象的类型称为它的动态类型。(3)消息的多态。一个可以发送到基类对象的消息,也可以发送到派生类对象,从而可能会得到不同的解释。p262. 倒数第16倒数11行(用新的段替换老的段,请仔细输入新段落的文字)错:一旦在基类中指定某成员函数为虚函数,那么,不管在派生类中是否给出virtual声明,派生类(以及派生类的派生类,依此类推)中对其重定义的成员函数均为虚函数。这里的重定义是指:
8、对派生类中定义的成员函数,其函数名、参数个数和类型以及返回值类型与基类的某个虚成员函数相同。当基类的虚成员函数返回值类型为某个类(假设为C)或其指针或引用时,则派生类中重定义的成员函数的返回值类型也可以是类C的派生类或其指针或引用。派生类对基类虚函数的重定义又称为超越或覆盖(Override)。对:虚函数的动态绑定隐含着:基类中的一个成员函数如果被定义成虚函数,则在派生类中定义的、与之具有相同型构的成员函数是对基类该成员函数的重定义(或称覆盖,override)。这里,相同的型构是指:派生类中定义的成员函数的名字、参数类型和个数与基类相应成员函数相同,其返回值类型或者与基类成员函数返回值类型相
9、同,或者是基类成员函数返回值类型的派生类。一旦在基类中指定某成员函数为虚函数,那么,不管在派生类中是否给出virtual声明,派生类(以及派生类的派生类,依此类推)中对其重定义的成员函数均为虚函数。p270. 倒数第3行倒数第1行错:a A_vtbl b B_vtblvptr: A:f vptr: B:fx: A:g x: A:gy: y: z:当通过引用或指针访问对象的虚成员函数时,将利用虚函数表来动态绑定实际调用的函数,例如:对:a A_vtbl b B_vtblvptr: &A:f vptr: &B:fx: &A:g x: &A:gy: y: z:当通过对象的引用或指针访问类的虚成员函数
10、时,将利用虚函数表来动态绑定实际调用的函数,例如:p271. 第1行第8行错:typedef void (*FuncPtr)(void *); /FuncPtr是一个指向成员函数的指针类型。typedef FuncPtr *VtblPtr; /VtblPtr是一个指向虚函数表的指针类型。A *p;. p-f(); /编译成:(*(VtblPtr*)p)(p);p-g(); /编译成:(*(*(VtblPtr*)p+1)(p); 当通过引用或指针访问对象的非虚成员函数和不通过引用或指针来访问对象的成员函数时,则不用虚函数表来进行动态绑定,而是采用静态绑定,例如:对:typedef void (*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计教程-用C+语言编程 程序设计 教程 C+ 语言 编程 四次 印刷 勘误表
限制150内