C++ address confusion
陈树振 陈翼男 著
C++释难解惑
函数Point::area的入口地址
函数Circle::area的入口地址
函数 Rectangle::area 的入口
Point 类的虚表
Circlet 类的虚表
Rectangle 类 的 虚
表
&Rectangle::
..
area
虚指针
r
.
.
&Point::area
..
&Circle::are
..
p
虚指针
.
.
a
c
虚指针
.
.
v
p
t
r
C++释难解惑 /陈树振 陈翼男 著
内容提要
对标准 C++中的常见的疑难问题给出了比一般教材更为深入的解释;也对一些教材中不常见但
在阅读经典著作时会遇到的疑难问题进行了解释;对流行教材本身存在的问题进行了探讨;对学习
完普通教材后向 C++实际编程过渡所欠缺的知识进行了补充并提供了两个典型开发实例。
本书最大的特色就是深入和细腻,尤其是对虚函数机制的阐述。
本书是 C++程序员新手的领路书,也是计算机专业青年教师、研究生和本科生的参考书。
C++释难解惑
编 著 陈树振 陈翼男
序言
我自上世纪八十年代开始,就担任了国家教育管理信息系统建设工作。组织
了多项教育统计信息管理与教育统计信息分析软件的开发工作。
这个时期,正是世界性的网络技术大发展、和应用软件大开发时期。在微处
理技术、计算机技术和网络技术的支持下,各种开发语言和各类信息处理技术的
研究十分活跃。陈树振老师在“高级语言”教学和应用方面都有独到的建树。我
一直希望他把他的成果和经验写出来,这是一笔财富,我相信会对后来者有所启
发、借鉴和帮助。
自上世纪八十年代末,面向对象技术成为软件开发的主导思想,这要归功于
C++语言的发展。自那时起,C++的教学和研究就在中国的高校教师和广大 IT 工
作者中开展起来,一时蔚为壮观。
陈树振老师就是这条战线上的一位老兵,自上世纪八十年代起,在实际编程
中默默地工作了十年,所开发的实际应用程序受到了用户的喜爱,在我国计算机
应用的初期,为应用软件的普及和推广贡献了自己的力量,同时也用辛勤换来了
扎实的基本技能和较多的开发经验。也正是这些技能和经验,使得本书对从事实
际开发的程序员会有参考价值。
陈树振老师对于教学的认真并受到学生的欢迎是我所目睹。陈老师在长期教
学实践中孜孜不倦地研究教材,并刻意研究教学与实际编程方面的联系问题,本
书就是陈老师十四年 C++教学及研究的结晶,相信对高校的年轻教师的教学有所
帮助。
陈老师在 C++基础理论方面也投入了很多的精力,有自己独立的思考和看法,
老骥伏枥,难能可贵,相信本书能对高校优秀学生及青年教师的专业提高会有所
帮助。
在本书出版之际,作为陈树振老师的老朋友,我衷心地向陈老师及陈翼男博
士表示祝贺,并祝愿本书能受到广大读者的欢迎。
教育部(原国家教委)教育管理信息中心 副主任、研究员
张守贵
2012 年 5 月
版权申明
本书尚未出版,先放到网上给大家免费下载和阅览。本书正式出版前读者可以研读和自
由传阅本书电子版,但不允许私自大量印刷和销售。出版社如想出版此书可通过邮件联系作
者商谈出版事宜。本书稿已经国家版权保护中心进行了作品登记,登记号为:2010-A-023237。
写在前言之前
我今年 65 岁,做过 10 年程序员,在大学教过 15 年书,我与陈翼男博士合写了一本书
稿,这几年来一直在投稿。出版社对我们的书稿评价很好,但他们就是由于经济上的风险,
总是在出版的最后关头反悔。其中北京****出版社已经签字画押的情况下反悔;北京****出版
社与我签过电子合同;书稿在**大学出版社放了 9 个月,还让我请名人写序言,最后说现在
书很难卖,并且还给我发了个近半年的图书销售的 excel 文档让我看,希望我理解出版社。
我只好仰天嗟叹了。
有编辑朋友建议我把书稿放到网上让读者试读,以印证读者的人数和满意度。我想这是
一个办法,即使永远不能出版,也能对社会有所贡献,并且我在网上也看到这个办法成功的
先例,例如《C 语言深度解剖》,后来在网上看到就由北航出版社出版了。
下面我把一些出版社给我的来信摘录下来给读者作为参考。您可以看到,我们的书名在
不同的出版社和编辑面前改了好几次名了,现在书稿的名字是我自己起的。
//-----------------------------------以下是**大学出版社编辑的来信------------------------------------
陈老师,
选题我暂以《C++释疑解惑:课本没讲透的 131 个问题》的名字报上去了。通过审批应
该问题不大。下面几点,是咱们电话里说过的,麻烦你着手进行啊:)
//-----------------------------------------------------------------------------------------------------------
陈老师好
从您的来信,我觉得您的文字驾驭能力挺好的,如果您的书,能写成您给我来信的风格,也
不错,现在市场上还就缺这样的书。那种一步步讲操作,枯燥的原理,确实没人愿意看,而
那种语言比较生动,穿插一些开发故事,体会心得之类的文风,让冰冷的技术活了起来,容
易引起读者的共鸣。所以,建议书至少 300 页,写得生动些,多配些图,甚至每章最后都可
以增加上一些问答,比如您历年教学收集到的经典问题等等。当然,其他的一些方法,也都
可以尝试,我这里只是抛砖引玉。
//----------------------------------------------------------------------------------------------------------
前言
尊敬的陈老师:您好!
由于负责这本书的编辑已经离职,这本书现由我负责与您沟通及出版事宜。
这本稿件从市场上鲜有的写作角度出发,揭示了 C++的很多难点,有些内容具有一定的深度,
同时又力求在写作上深入浅出,会有一定量的读者关注书中的问题,这是本书的一大特色。
//---------------------------------------------------------------------------------------------------------------
陈老师:您好!
今天,就这部书稿又与领导进行了沟通。从这部书稿可看出,其中积淀了您多年的经验和
大量心血,力图为读者学习 C++排疑解惑,实属难能可贵。
从现在的销售数据(开卷数据:专门的图书销售调查数据,采集自全国 2000 多家书店,随
邮附上)看,目前市场上同类书整体销量不理想(月销 200 本以上较好),即便在这样的数据
面前,相对好销的书还属于基础入门的书或教材。在此,也冒昧地想和您探讨,如何将此书
出销好的办法,比如:您能帮助出版社做哪些宣传推广,或者利用院校资源推广销售,以及
在零售书店怎样做宣传,才能让读者广泛知晓本书并认可,从而形成销售。
//--------------------------------------------------------------------------------------------------------------
陈老师:您好!
从来信看到您对开卷销售数据进行了详细分析,相信您也看出零售图书市场的销售状
况,即便是第 1 名的图书也不过 160 本/月,假设书店与网店销量平分秋色,每月的总销量也
只有 320 本,一年的销量为 3840 册,按计算机书的平均销售周期一年半计算,预计为 5760
册(纯零售不包括教材)。以此推算,当月销量在 100 本的书,预计 3600 册。这个销量如果
没有教材的销量支撑,从出版社的成本计算基本上是没有什么利润的,如果计算上在途、退
货等因素,稍有不慎恐怕就会亏本,这基本上就是纯零售书的状况。
信中提到的几位作者的书,销量多则 50 多本,少则几本,如果纯靠零售销售的话,简
单可以看出最终销量的情况。
社里对您这本书的含金量一直都是肯定的,只是苦于店销图书的销售状况,也深知您的
身体状况在写作上将要付出的巨大努力,觉得再让您改稿实在是有些不合适。
//-----------------------------**大学出版社电子出版物编辑的来信-------------------------------------
陈老师您好:
我与图书编辑沟通了,就如您告诉我的,他对本书的质量不持疑义,主要考虑的是本书
的经济效益。我们作为电子出版和网络出版部门,还没出过单独的网络出版物,这条路暂时
不考虑。电子出版物 5000 左右的成本,包括生产成本和人力成本,要保证持平的话,恐怕要
由作者承担。这是我向领导报选题时的一项。您作为作者,据我理解,如果没有相关经费支
ii
持,由您个人承担是有问题的。所以这个选题的前景还要您考虑。
前言
前言
本书的目的是为一些樵夫建造几座小桥,这些樵夫包括 C++程序员、青年教师、研究生及需要参考书的
本科生。
一座小桥是将现行标准 C++教材与 Visual C++、Borland C++方面的一些优秀书籍连接起来。优秀著作《深
入浅出 MFC》为什么难倒了那么多不应该被难倒的人?那是因为现行 C++教材与这些著作之间知识上有断
层。这也不能过于责怪教材,它面向的读者并非将来都去作高级程序员,况且教材有时间和篇幅的限制。
另一座小桥是将现行标准 C++教材中的例题与程序员的实际编程连接起来,旨在解惑。一般教材为了精
炼,许多地方避开了实际应用。例如多态性问题,我们为何偏偏用基类的指针指向派生类的对象?有的教材
试图解释,说是为了有一个统一的接口,并以一个参数是指向基类的指针的外部函数作为‘统一的接口’来
讲述。虽然似乎有道理,但遗憾的是这个外部函数在实际编程时恐怕不应该有。
本书内容涉及最多的是虚函数和多态性。虽然 C++的根本目的是为了继承和代码复用,但虚函数机制却
是它的技术精髓,是 C++最难理解的内容,没有虚函数机制 C++就不是面向对象的语言。本书力求在语言层
面和应用层面上两方面深入讨论这个问题。
在语言层面上,本书细致深入地讨论了虚函数机制和虚函数如何增强继承性两个方面。C++大师 Stanley
B Lippman 说:“我的经验告诉我,如果一个程序员了解底层实现模型,他就能够写出效率较高的代码,自信
心也比较高。”
在应用层面上,本书提供了两个实际案例,它们体现了面向对象语言的三大特性尤其是多态性的用途。
本书力图用简单的例题描述出多态性的美妙。编制实际可用的程序是每一个学生所关心和困惑的。本书的这
两个实际案例,完全是笔者编制的,程序的套路是面向对象的典型做法,极富代表性。笔者强力推荐编程实
践不足的读者阅读这两个程序。本书宗旨之一就是引领刚辞别课堂的读者走进编程实践。
本书还有一些内容是教材中的难点,笔者力争细致入微,旨在释难,有些甚至用到了汇编码的分析,这
有利于青年教师、研究生及在校优秀大学生的深入理解。本书还对流行的教科书存在的一些问题进行了探讨,
例如‘++’运算符重载函数的返值问题等。笔者相信,连教科书都会出现的问题一定具有探讨的必要。
本书还包括少量的通常教科书不涉及的一些标准 C++的难点的讨论。
本书示意图中对象图的画法没有遵照软件工程中的 UML 语言的画法,尤其是存在 is-a 和 has-a 关系的时
候,因为这里需要大致地反映对象在内存的映像。
本书不包括面向过程的内容的探讨。
本书力争通俗易懂,又具有一定深度。除了参考了许多书籍以外,一些结论是笔者通过调试器单步运行
逐句分析出来的,是独立研究的结果。我们都曾长期从事实际编程,理论的学习研究相对薄弱,专业水平有
限。鉴此原因,笔者衷心希望读者提出批评意见,并在此表示感谢。
愿本书成为引玉之砖,使更多的人对编程语言和编程技术进行更深入细致的研究。
我的博客:http://blog.csdn.net/chenshuzhenteacher
来函请用电子邮箱:chenshuzhenteacher@126.com,欢迎来信。
陈树振 2011-8-18
iii