研究生复试容易过吗的时候档案袋里的专业信息填错了,设计学写成了环境艺术设计,这个对以后毕业工作会有影响吗

利物浦大学的创建源于城市发展嘚需要和同期成立的大学一样,为当地工商业服务责无旁贷地成为大学的首要任务

利物浦大学的前身利物浦大学学院于1881年成立,1882年第┅批学生入学1884年始成为英国

在1880—1903年期间,这所大学已经形成了自己的特点1894年,世界上第一个公共无线电传输系统在利物浦大学诞生兩年之后在利物浦大学

首次在英国被运用于外科手术。1899年利物浦大学出版社建立,它是英格兰三大古老的大学出版社之一在那段时期利物浦大学的学生获得来自伦敦大学颁发的学位。

利物浦大学1903年经皇家特许和国会议案而升格为一所独立大学之后利物浦大学在多个领域取得了重大成就,包括:查尔斯谢林顿爵士发现了突触威廉·布莱尔贝尔教授研究

治疗癌症,20世纪30年代至40年代约瑟夫·罗特布拉特对

的发展作出了重大贡献。1943年至1966年细菌学教授艾伦·唐尼参与消灭天花。

1994年利物浦大学成为世界著名的

创始成员之一,该集团包括24所英國最顶尖的研究型高校利大同时也是

的创始成员之一(2004年)。

位于英格兰西北部港口城市

(The Russell Group)成员之一。和N8研究合作集团的创始成员の一利物浦大学成立于

年,是英国六所最原始的“红砖大学”之一学校在多个研究领域享有极高的国际声誉。迄今为止学校已经培养絀了

(包括英国的第一个诺贝尔奖得主)并孕育出了英国第一个建筑普利策奖得主。根据2013/14《

根据2018上海交大《

》(ARWU) 利大排名介于101-150名之间,國内排名介于9-16名之间

目前学校设有230多个学士学位课程,横跨103个专业在校学生超过14,000人,其中研究生人数3,200多名国际学生的人数2,800多人,来洎全球100多个国家其中本科生1,200多名,研究生1,600多名1,700多名教学人员从事教学及科研工作。许多中国学者和学生在这里工作和学习利物浦大學是英国第一所建立建筑学、

、生物化学、海洋学学科领域的大学。学校年收入[引用日期]

  • 13. .利物浦大学官网[引用日期]
}

从多年辅导和阅卷的情况看考苼英语作文的成绩并不理想,比如2004年的500份考卷抽样分析的结果是:成绩好的(17分以上)约为12%;比较好的(15分左右)为约30%;差的(10分以下)约为35%;很差的(少于8分)约为23%。如果考生想在较短的时间内对考研英语写作有所认识、有所突破首先应该了解考研英语写作常见题型,并了解各种题型的写作技巧然后进行有针对性的练习,并且研读相关范文

干货:利用四六级答题小技巧提分 2018英语四六级考试临近,同学们复習时间已经不多无论复习的是否充分,都需要掌握一些答题的小技巧方法有时候也可以为你带来高分。希望这篇文章里的答题技巧能夠帮助你在考试的时候科学地多拿一些分数~ 重要的事情先说三遍: 把最新考试大纲完整看5遍并勾重点! 把最新考试大纲完整看5遍并勾重点! 把最新考试大纲完整看5遍并勾重点! 一、做题时间安排技巧 【题型顺序:作文-听力-收作文&听力卡-阅读理解-翻译】 购买英文印刷版. 原书版權为 Zed Shaw 所有, 如果你想使用该翻译内容, 请联系本人以及原作者 /fksec/article/details/7888251 让Oracle跑得更快:Oracle10g性能分析与优化思路 本信息 作者: 谭怀远 丛书名: ITPUB技术丛书 出版社:电子工业出版社 ISBN:3 上架时间: 出版日期:2010 年8月 开本:16开 页码:438 版次:1-1 编辑推荐    国内第一本真正意义上从工作经验出发以作者的心嘚体会全面论述Oracle数据库性能优化的书籍。    作者内心经历的表白站在全局角度对性能做分析,而不是拘泥于具体的技术细节呈现给讀者一种新的阅读思路。    书中涉及很多新的性能话题比如执行计划,bind peeking并行执行,10046及10053事件AWR报告等,基本上涵盖了所有Oracle数据库性能方媔的知识。 内容简介   在这本书里读者将会学到作者在性能优化方面的一些思路和思考一些故障处理的方法和原则,这些东西是作者茬实践中长期积累的心得体会当读者掌握了一些处理问题的基本思路之后,成为一名合格的dba就是一件轻而易举的事情了   本书适用對象:oracle dba、oracle开发人员,和其他对oracle数据库感兴趣的人员 作译者   谭怀远,副总工DBA团队负责人,在国内属于较早进入专职DBA岗位的人是国內著名数据库论坛ITPUB的资深版主,论坛id alantany有10年的Oracle DBA工作经验,从Oracle 8开始进入数据库领域从Oracle 8到Oracle 8i,Oracle 9i,Oracle 10g,见证了中国DBA职业的发展历程作者对数据库的性能优化有独到的见解,颇擅长于海量数据数据库的设计管理及优化工作 目录 封面 -17 扉页 -16 版权 -15 序 -14 前言 -12 致谢 -5 目录 -4 第1章 引起数据库性能问题的因素 1 是国内最早的一个专业讨论Oracle数据库技术的论坛,目前在国内数据库方面已经相当有知名度笔者是2001年注册的,算是最早的会员之一目湔仍然会经常上去看看,由于工作内容的关系我比较关注性能方面的帖子,发现以下一类的帖子经常有很多比如:   网站的创始人Tigerfish為本书写序,我一直对他怀有敬意他在推动中国Oracle数据库的发展 上功不可没。   感谢biti(冯春培)eygle(盖国强),kamus(张乐奕)和warehouse(谢永生)他们都是国内顶尖的Oracle专家,感谢他们为本书写的精彩点评   还有来自ITG的Mike,感谢他的热心帮助和鼓励   感谢ITPUB的王蓓小姐(贝贝),在本书的出版过程中她做了大量的协调工作,才保证这本书的顺利出版   感谢电子工业出版社的张月萍策划和高洪霞编辑,是她们的努力让本书更具可读性和完整性   最后要感谢我的妻子tracy和儿子思墨,是他们让我一直努力工作最终使本书得以问世。   后 記   关于数据库的学习方法   我想在这里聊一些数据库方面的学习方法算是对自己这些年学习的一个总结,也可以给那些才进入Oracle领域的朋友们提供一些借鉴如果能够使你有所收获的话,我将非常高兴   1、英语和技术的关系   从2005年开始到现在,我只看过三本关於数据库方面的印刷书籍都是由一个人写的,他叫Tom Kyte业内都叫他Tom,这三本书分别是:   ● 《Expert   在买这三本书时多少带有些许盲目性,因为崇拜书的作者所以爱屋及乌地买了他写的所有的书,实际上我用在看这三本书上的时间并不多更多的时候我都泡在这个网站仩,就是这个网站改变了我对问题的思考方式和学习方法。   对于大多数中国人来说特别是做技术的人,英语成为很多人的软肋這是一个无奈的局面。我甚至听到很多人在说为什么非要学习英语,自己国家的话说好就行了言辞之间颇鄙视那些学英语的“崇洋派們”。本身这句话也还不错作为自己国家的公民,学好自己国家的语言自然是再好不过的事情。但是很遗憾的是我们说着自己的语訁,却在用着别人的东西用别人的东西,却拒绝学习别人的语言这看起来不免有些矛盾。如果有一天世界上所有的商业软件都来自于Φ国那么我们再自豪地鄙视那些学习英语的人也不迟。   所以我必须要说的是如果你想把计算机的技术学深一些,请你务必要学好渶语至少要做到能够熟练阅读英文文档的哑巴英语,如果再进一步你能够使用英语和别人做书面的沟通(比如在论坛中或者E-mail中提出问題),那会更好一些   在中有来自世界上很多国家的Oracle DBA或者开发人员在提出问题,我最初的时候只是浏览后来尝试着用自己蹩脚的英語向Tom提出了一个问题,当收到Tom给出的回复后当时心情真是无比的激动,可喜之余不免又甚感悲哀为什么一个简单的提问,却让我欢喜臸此呢原因大概是,我们和他们之间沟通太少了一个小小的问答,对我来说就像跨过一个巨大的鸿沟   之后的日子里,就慢慢习慣了这种学习方式当我有一个问题,在找遍了所有的Oracle官方文档Google和Metalink(一个Oracle公司的在线技术支持平台)未果之后,总是能够在这里得到一個确切的回答它已经变成了我在技术上最后的依靠了。   我们不得不承认和接受一个现实由于语言的沟壑,使我们学习起这些西方囚发明的东西时比他们自己的人要困难得多,比如对于一个软件他们已经习惯于随手看一下软件的Manual(联机帮助手册)来了解这个软件嘚用法,而我们却还在傻傻地等待着软件的汉化或者翻译过来的软件使用教程呢(市面上有很多书都是简单地将某个软件的manual翻译过来然後出版),这种语言上的障碍使我们和他们在技术上有相当大的差距这就是我在论坛上得到的最切身的感受,我们不仅在技术本身上洏且在一些思维方式上和他们也有明显的不同,这不是妄自菲薄是我们中国IT从业人员的现状,我们只是封闭在自己的圈子里面做研究卻并不知道外面已经是个什么样子了。   我希望大家能够把英语学好(我本人也在努力地学习中)Oracle的官方文档全都是英文的,metalink也全都昰英文的asktom网站也都是英文的,如果我们能够熟练地使用这三个资源那么我们的技术水平必将上一个新的台阶。   .cn 查找 进入机考时代太傻单词横空出世,考gre背不背红宝书越来越有争议而背太傻单词已是天经地义,尤其是机考类反几乎不出太傻类反所以背好太傻单詞,背好太傻类反成为考好gre的必要条件。 纵观中华天下尚无一个专门针对考Gre而设计的背诵太傻单词和太傻类反的软件,(大部分软件茬用于背gre和其他英语单词时并无太大功能差别)于是[太傻单词类反之cracking]应运而生了! 专门为背诵太傻而定身量做:特别适用于背诵太傻单詞,太傻类反提供单词背诵模式和专门的类反背诵模式;强大的单词和类反的高速智能查询功能;自动手动记时分组等多种背诵模式;铨开放的txt文本格式单词库和笔记本;结合太傻单词列表的强大单词制作工具;3.0版本更提供了全新的界面定制,还能生成水晶窗体让您赏惢悦目的背单词…… 当然背诵红宝书,甚至四六级词汇也未为不可只是很多针对太傻单词针对Gre的背诵功能用不上了。 (内含各种词汇列表) [太傻单词类反之Cracking]十大功能特色 ◆1◆ 用书背了很多list后虽然复习了好多遍,但背出来的单词仍能背出来而没记住的单词仍然没记住。[呔傻单词类反之Cracking]可以方便的把不熟单词一键加入笔记本组成新的单词列表,进行针对性背诵 ◆2◆ 很多软件在滚动单词时都用鼠标操作,不但操作缓慢不便而且时间一长就疲劳,[太傻单词类反之Cracking]可以全用自定义键盘操作而且单词采用大字体,长久背诵眼睛不会疲劳! ◆3◆ 背太傻单词第一遍时很多单词还不认识,看类反很不方便[太傻单词类反之Cracking]中双击类反中单词,立刻显示其英文释义并可切换中譯或英译。 ◆4◆ 看了一遍类反可能还没牢记,而且背书时类反解释又去不掉[太傻单词类反之Cracking]可以把类反当单词背,为此提供了专门的類反背诵模式可以方便的双击显示每个单词的解释,将选中单词加入备忘,归类不熟类反缓出释义等。 ◆6◆ 背了几遍单词觉得大部分熟了,但是对某些单词的反应太慢降低了做真题时类反的解题速度,利用[记时模式]背单词或类反系统会自动记录你的反应时间,背完後通过移动滑杆,就可以精确的知道各个反应时间段内有哪些单词可以重点突破,提高类反能力 ◆7◆ 单词背诵终于快大功告成之时,就需要反复的复习[手动模式]可以删除熟练背出的单词,背一个删一个很有成就感;[自动浏览]可以根据自己的熟练程度,不但随意调節单词缓出时间和还能调节释义缓出时间两秒一个单词,一小时就轻松过了一遍 ◆8◆ 做真题类反和看机经的时候,类反的查询相当有鼡对不确定或不知什么对应关系的类反,只要输入任意一部分立刻会通过模糊匹配,找出太傻类反中对应的类反结合英译,较难的類反一般也都能解决吃透 ◆9◆ [太傻单词类反之Cracking]还为用户提供其他实用功能,如:想背诵红宝书去掉太傻单词只要通过[并集,差集]就能竝刻制作好所需单词列表;[当前状态的完全保存]使您下次打开软件时就像是经过休眠一样精确恢复;[词频制作]可以为你找出机考最长考嘚单词;[类反制作]可以一次性为你找出一组单词的所有类反;当然 [乱序],[中英置换][单词大小写],[文件的打开保存],[词频制作] 等基本功能当嘫一应俱全 ◆10◆ 还有配套的工具软件[Improve太傻]专门通过[太傻单词电子版]即时制作更新太傻单词,太傻类反太傻英译列表。 愿[太傻单词类反のCracking]对大家考Gre真正的有帮助!

下载 第1章开发思想 命名是所有事的开始 要真正掌握一门编程语言,不仅要理解它的语法和语义更重要的是掌握语言所体现的哲 学思想、语言产生和发展的背景以及设计特点。 1.1 PHP与我 大家是否想过为什么会有这么多的编程语言?除了所谓“主流語言”例如C、C + +、 P a s c a l等之外还有其他的如L o g o l、C o b o l、F o r t r a n、S i m u l a和许多更加特殊的语言。当列出一 个项目的梗概时大多数软件开发者不会真正地考虑到可鉯使用多种编程语言;他们都有自己 偏爱的语言(也许是公司指定的一种语言),了解它的优点和它的缺点并根据语言的具体特点 修正項目。但当克服所选语言的缺陷时就可能会增加不必要的额外工作。 了解如何使用一门语言却缺乏其特定的概念知识就好像一个开卡車的人想参加二轮马车 比赛一样,当然一般来讲他应该懂得如何驾驶二轮马车,他甚至可能在终点线上跻身前列 但他绝不可能成为一個出色的车手,除非他熟悉新车的独特之处 类似地,当面向对象程序设计( o o p)程序员编写一个应用程序的时候他会尽力使程序满 足项目要求,处理同一个任务不同的程序员会运用不同的方式。哪种方式更好每一个程序 员会说他(她)的方法最好,但只有那些熟悉两種概念—o o p和过程化编程—的人能够作出 判断 前面提到的每一种语言代表一种解决问题的特定方法,这些问题多属于具有特殊要求的某 一特殊种类因为这些语言集中在一个有限的应用领域内,他们的成功性也限制在这些领域 像C和P a s c a l这样的语言变得如此流行,就是因为它们被广泛应用并且它们不针对特殊问题, 却提供了能很好地解决普遍问题的工具 那么P H P是如何适应这一体系的呢?尽管它被称之为一种语訁但P H P并不是一种真正独立 的语言,而是许多语言的混和体它主要用C的句法,但与C有很大不同它是被解释的, P H P 能识别不同的变量类型但没有严格的类型检查, P H P识别类但没有结构体类型,类似的例子 很多但你可能已领会到了关键一点: P H P融合了许多种不同的解决问题嘚思想,形成了一种全 新的、独一无二的方法 为了能够用P H P成功地开发We b应用程序,我们鼓励你首先回答下述问题: P H P是我的项目 所需的理想語言吗问得好。如果我们说不那我们就会显得很愚笨(谁会去写一本关于他们 第一部分高级P H P 认为不好的东西的书呢?)让我们重新闡述这个问题,对项目来说有比P H P更好的语言吗这 次我们可以很有把握地回答,如果你正在从事网络应用程序的开发 P H P就是为你准备的最恏的 语言。 1.2 计划的重要性 你为什么应该阅读这一部分 即使你是一个很熟悉P H P的职业程序员我们也建议你阅读下面的部分,因为这里包 含了荿功开发的基本知识如果你对所讨论的题目已很熟悉,也应该花时间浏览一下 你可能会发现新的信息—新的题观点、新的解决方法、噺的答案,你对解决未来项目 的不同方面的问题了解得越多你就能越好地抓住关键点,并且用更好的方式处理我 们希望你信任我们是職业开发者,并相信我们的经验这将使你在以后受益。 在深入探讨P H P特定问题之前先让我们从一个更广泛的观点开始。不论你使用什么語言 也不论你在什么平台上开发。有一些问题在应用开发中是总会涉及到的 当从事一个专业项目的时候,考虑一下你正在做什么是至關重要的“了解你的敌人,永远 不要低估它”尽管你的项目并不是一个真正的敌人,这句话的寓意仍然适用在转向其他题目 时,要知道项目的所有技术条件、目标平台、用户并且决不要低估那些没有考虑周全的小问 题的重要性。 据我们的经验计划占用了5 0 %的开发时間。项目越大它的纲要就应该越详尽。这一原则 既适用于同你的顾客相联系并与他们密切合作以确定一个总的项目概要又适用于与你嘚开发 者探讨确定一个编码概要。在一致性和可维护性上花的气力越少就越容易在重新打开旧文件 并设法清除错误或添加新的特征时遇箌问题。 计划所用时间与项目大小并不一定成比例例如,想一下要设计的一个搜索算法这一应 用程序只需要在一堆信息中进行基本的,搜索并能根据规则抽取数据由于数据已经存在,所 以创建和输出将不会需要太多的努力这一应用程序将把它的大部分运行时间花在搜索循环上。 这个循环也许用不了1 0 0行代码但是为一个优化的循环选择设计一个优化的算法很容易耗费一 整天的时间,这个小小的循环也許是设计阶段最庞大的部分但另一方面,你可以在不到一天 的时间内策划好数千行的代码 同样,我们假定需要一个小脚本来列出某个目录中的所有文件你能够很快地完成它,使 其能从事某一特定任务在一个特定的目录列出所有文件,不必再担心它了—问题已解决 鈳以转向其他任务,把你的程序抛在脑后但另外一种策略是考虑一下以后的某个时间,甚至 可能是在一个完全不同的项目中—你可能会洅一次需要一种类似的工具仅仅一遍又一遍地 重做目录列举器,每一个对应一个特定的任务这简直是在浪费时间。因此当首次遇到這种 情况时,应该考虑到这一点应从一个目录列举器中创建一个分离的模块,允许它列举不同的 目录有选择性地递推子目录,甚至允許使用通配符你可以创建一个“防弹”函数,它即能 处理大多数特例又能完美地应付一个目录列举器的普通要求。采用这种策略经过幾个项目之 后你将拥有一个工具参数的库,可以安全地重新使用和依赖这个库从而可以极大地减省开 发时间。 2部分第一部分分高级PHP 下載 当然有了一个日益增大的免费工具函数库,依然不能满足全部需要也不能优化这个库 以适应特殊需求,有些库太庞大以致不能随处咹装因为每一次选中都必须分析几百K字节的代 码,这将严重降低站点的性能在这种情况下,需要用1 0 0 %自己创造的优化解决方案以取代 非最优解决方案。 更大的项目如果缺乏计划将导致更多的错误在开发后期,可能会遇到没有或无法预见的 困难这是由于缺乏计划的时間和工作,这些困难可能会严重到让你彻底地重组整个项目例 如,对一个依赖额外数据库提取层的数据库支持的应用程序其数据库提取层仅能接收文本数 据,但后来你发现也需要用它接收数值性的数据通过工作区转换,可以使它能够接收数值性 数据但后来你又感觉箌这个工作区仍旧不能满足需要,这时唯一能做的就是改变数据库接口 这需要重构提取层并对所有主代码调用进行检查,当然也需要清除先前创建的工作区 这样,数小时甚至整天的工作将不得不耗费在本来从一开始就可以避免的问题上这些问 题往往决定了程序开发的荿败,因为“时间是你永远都不可能充分拥有的珍贵资源”下面的内 容将针对大部分基本的却是非常重要的开发中的实际问题进行讨论:改善代码质量以及基本设 计和文件管理的问题。陈述完这些后我们创建一个应用程序接口( A P I),采取简单的、实用 的方式使你熟悉这┅新的思想然后我们从头创建一个A P I,在纸上从理论上开发它并明确一 些实用规则来帮助你实施下一个A P I,例如风格问题、以及商业技巧等 1.3 编码规范 好的编码和差的编码之间究竟有何区别呢?实际上这个问题很简单。好的代码(确实好 的代码)能够像一本书一样被阅读你能从任何地方读起,并且能够时刻意识到你所读的这些 行是干什么用的它们在什么条件下执行,它们所要求的设置即使你缺乏背景知识,遇到了 一个错综复杂的算法你也能很快看出它所从事的任务,以及它的风格 举个例子,然后说“照着做”总是很容易的但峩想这一章应该使你打下写专业化代码的 坚固基础,这一基础将区分真正精心编制的代码和一个草草完成的程序段抱歉的是,由于篇 幅所限我们不能按我们所希望的那样详尽地讨论良好的代码书写风格的每一方面,但本章将 给你一个很好的开始我们期望你能迅速获得專用的材料,以熟悉软件设计和工程的每一要点 编码是一个很广的领域,几乎是一门独立的科学有许多论文论述它,虽然这些论文大哆很乏 味很理论化,但在应用中是不可放弃的下面我们就最重要的问题进行最基本的讨论。 1.3.1 选择名字 选择变量名可能是程序员最常做、但却想得最少的如果你已建立了这些在大项目中出现 的变量名字、类型、定义位置的清单,那么你就创建了一个类似于小电话簿的东覀你想让你 的清单成为什么样子呢?不同的命名方案已发展起来了它们有不同的思想及各自的优点和缺 点,这些方案一般分为两类:簡短的变量和函数名及谈话式的变量和函数名(描述变量类型和 目的的更长的名字) 某个电话目录可能是这个样子的,如表1 - 1所示 第1章認开发思想部分3 下载 表1-1 电话目录 姓名地址电话 J . D . 3 8 2 W. S -3 9 5 1 M . S . 2 0 4 E . R . -8 3 8 2 这份列表非常有意思:该列表有两个条目,但并没有更多的信息人名只有首字母,没囿 全称;只有房间号但没有街道名;只有电话号码的一部分,却没有完整的号码 让我们看另外一个例子,如表1 - 2所示 表1-2 电话目录 姓名哋址电话 h t 5 f t 9 i n a g e 3 2 J o h n 386 West Street,L o s + 1-5 5 5-3 0 4-3 9 i a S m i t h f e m a l e s i n g l e U S A,E a r t h 在这个例子中每个人的名字包括身高、年龄、性别及婚姻状况。地址中不但包括街道和 城市而且也包括州、国镓、甚至星球。电话号码附加了国家和地区号 第二种解决方案比第一种好吗?两个都不是最好的在程序课上讲授的这两种解决方案, 嘟不令人满意定义一种类型t p I n t t e g e r C o u n t e r I n s t a n c e这样长的名字)也是不可 接受的,尤其当我们从事的是像压缩这样复杂的缓冲操作的时候更是如此 这只是普遍思想被误用的一个简单例子,该怎么办解决的办法是选择好的整体思想,然 后在适当的地方加以例外处理当写一个应用程序时,應该知道你的代码从事的是什么工作 能够快速地从一点转到另一点—但其他人可能认为这并不容易。如果你从开发组的某个人手 中获得┅个源文件并需要添加一些特征首先必须对其进行整体把握,并区分代码的各个部分 理想情况下,这一过程将和阅读源文件平行进行但由于在没有提示和公共样本帮你理清代码 来阅读的情况下,这是不可能做到的所以在源代码中包含尽可能多的额外信息,并且使得奣 显的事实不易于混淆就显得很重要了 那么如何能查知这些信息,并将其合并入自己的代码呢 ? 使代码更易读。 4部分第一部分分高级PHP 丅载 ? 如果可能选择谈话式名字。 ? 尽可能添加一些注释 ? 保持清晰、一致的函数接口。 ? 把代码结构化成逻辑群 ? 抽出单独代码塊。 ? 使用文件来将函数分类 ? 编写文档。 下面将讨论上述各主题 1.3.2 使代码更易读 在阅读的时候,为了理解文章的含义你的大脑必须汾析从你的眼睛里获得的信息,识别 出重要的部分然后把这些部分译成正确的代码。这个分析过程分两步执行:形式分析和逻辑 分析艏先通过检查文章的可视结构来执行形式分析,例如:检查段落、行、列甚至词之间的 空隙这一过程打破了对文章的整体了解,将其分荿更小块的树形结构假想一个结构严密的 树,有顶部的树节和底部的树叶树的顶部包含着最一般的信息,例如你要读段落顺序,树 嘚底部是诸如一行中的词序或是一个词中的字母顺序的一些东西 逻辑分析过程将提取这些形式信息,然后按顺序遍历此树并设法将信息译成有意义的结 果,这是一种语法上的翻译(这个句子有什么样的结构),还是一种语境式的翻译(这句话是 什么意思)在此处讨論中并不重要。重要的是:形式分析的结果越好逻辑分析就越容易、 越快、越好。 逻辑分析能补偿形式分析中失去的信息但仅仅是在┅个有限的程度上补偿。 你也许能读懂前面的这个句子但要花费比读本书其他句子更长的时间和更多的注意力, 在第一步分析中一些偅要的信息(间距)丢失了,你并不习惯这样 我们可以通过添加一些标点使其变得更简单易懂。 标点是进行形式分析的有用信息注意箌阅读这一版本或把注意力集中在所选的任意一点 上要容易得多。下一步: 这是你阅读句子的常规方式即阅读文章时最习惯的方式,但峩们也可用多行结构描述这 个句子: 这是可以让你能尽快地理解这个句子极端的方法的一种上面的断句阻碍了自然的阅读语 序,因为你並不习惯读一个在句法上被拆成单元的句子但对于源代码来说,这是一个优势 第1章认开发思想部分5 下载 因为源代码经常包含复杂的结構、公式等。使源代码保持清晰的外在形式、结构以帮助读者理 解是很重要的这可以通过使用缩进和在适当的位置放置编程语言的关键詞来实现。 让我们看一个简短的P H P程序: 这个代码本身也许并不是智力劳动的精品我们只观察一下它的结构,如果以前没有读过 这个片段你能够一下就指出主代码的起始处吗?你能标记出主代码中最初的和最后的说明 吗即使你能一下子找到想找的地方,你的眼睛也会不甴自主的从行首开始从左到右的浏览 在你认为目标可能在的地方停下来。你的大脑也要重复读这一行因为你会不时丢失形式分析 得来嘚信息。为了弥补起步时信息的缺乏你的大脑(逻辑分析区)也会采取这一步,并强调 两次正如电脑一样,你的头脑的能力是有限的所以,当你的大脑确实想要理解和记忆源代 码时逻辑分析区就在缺乏能力的情况下承担了额外工作。但是理解和记忆恰恰是你想让人們 在读你的源代码时所达到的也是你在读别人的源代码时想要达到的。 因此这就是为什么格式化源代码很有用的原因。还有别的原因嗎噢,是的格式好的 源代码看起来让人赏心悦目。 下面是一些指导原则其中阐述了我们所认为的在格式化源代码时的最优风格。请紸意 这些指导原则不是强制要求的,但可以认为是一般的规范许多工业的和开放式的项目已经用 这种方式将源代码格式化了。 并且采用这种风格经常会带来收益。 ? 块标志符( < ?、? >、< ? p h p、< %、% >、{、}等等)要放在不同的行里 ? 用tab 缩进所有的块(理想情况下,把t a b宽度改成不超過4的值) ? 在关键词和关系对象符之间要留有空隙,特别是在进行计算时尤其要这样做 ? 将代码的逻辑块分别放在连续的行里,使逻輯块分组并在块之间留有空行。 ? 用空行的方式分隔各个块 ? 用空行的方式把函数头、函数脚和代码的其余部分分开(输入全局变量被看作是函数头的一部分)。 ? 把每一块的注释并入代码 ? 在同一块内把所有行的注释放置在同样的一些列中。 作为一个例子清单1 - 2给出了某段格式化的代码。 清单1-2 重新格式化的代码片断 6部分第一部分分高级PHP 下载 大家可以看到这一小块代码读起来要容易得多。 在代码中空格的使用可以进一步把参数和关键词分开: 以上看似毫无必要,不过要记住:这些代码要被嵌入几千行代码之中所以必须改变你的 观点。有些人说在书写源代码文本时括号之间的空隙与其说有帮助不如说分散了人们的注意 力——我们必须承认,有些时候这是事实本书Φ的例子也并不都使用这种格式。我们认为 是否使用这种格式最后由你自己决定,最重要的则是:要保持一致性一旦你决定采用某种風 格,就一定要坚持至项目的完成如果你在修改别人的源代码,你也要尽量遵守他们的风格 在职业开发中,一致性是最重要的原则之┅ 要注意阅读所有源程序的例子,并尽量模仿他们的风格调整你自己的风格直至和这些最 初的例子很接近为止,一旦你对这种风格很熟悉你会发现你所做出的努力没有白费。 在进一步阐述之前我们举两个例子来更好地说明这一点,如图1 - 1和图1 - 2所示 图1-1 坏的代码 图1 - 1中源玳码是要建立一个S Q L语句,除了最后的一行是把一个包含“ select *”的字符串 赋给一个名为$ q u e r y的变量外我们看不出图1 - 1中还有什么说明了该段代码的目的。与之相反 在图1 - 2中的代码中,你就比较容易理解代码的所有目的 第1章认开发思想部分7 下载 图1-2 好的代码 我认为代码就应该是这样,臸少应该近似这样代码应该有清楚的结构、很好的注释,并 且很容易理解 1.3.3 添加注释 我们无论怎样强调添加注释都不过分,尽管编程时伱可能认为这是最微不足道的事情在 编写高质量的代码时,注释是很重要的在解决复杂问题的时候,很少有两个人会有完全一样 的想法某些问题对于一个人可能是一目了然,而对于另外一个人可能是模糊不清的在这种 情况下,注释就是大有裨益的只要需要,你都應该把它们添加到代码中 目前主要有两种注释:头注释(例如文件头注释、模块头或函数头注释)和内部注释。头 注释主要起介绍性作鼡告诉读者一个文件要做哪些事情,或下面这一大段代码是关于什么的 内部注释用在函数内,或嵌入代码中以解释代码的某一行或某┅块所做的工作 下面介绍这些注释的外在感观及其所包含内容的概念。现在这些注释通常可通过快速应 用开发工具( R A D)或其他授权帮助工具来产生,但由于在撰写本书时仍没有适合P H P的类似 系统所以这些注释应该是手编的,尽管这会增加一些额外的工作量 下面按照注釋类型的抽象程度,从最抽象的到最具体的来讨论 保持注释不断更新 要记住在编写函数之中或之前就将其注释好,仅仅为了加注释而读┅个文件是非常 令人厌烦的工作同时,要注意在以后的某个时候如果对进行函数的修改就要适当地 更新你的注释。例如若增加或去掉全局变量,那么你也要在注释中对它们的使用注释 进行更新;同样如果参数顺序、类型等发生变化也是如此。 使用宏来加速你的注释 茬你最喜欢的编辑器中为每一种注释类型创建宏并给它们分配热键(例如,为文 件头分配Ctrl+Alt+Fl为模块头分配Ctrl+Alt+F2等等)。 8部分第一部分分高级PHP 丅载 如果编辑器支持的话可以把变量引入注释中,这种创建详细的有大量信息的注释 工作就变成了一个创建简短对话框问题 1. 文件头注釋 文件头可以像清单1 - 3那样编排 清单1-3 文件头注释 你可能偏爱使用多行注释创建的对话框,有人认为这样美观(如清单1 - 4所示) 清单1-4 文件头注释(使用多行注释) 2.在U N I X中提取块注释 在U N I X系统中,下面的g r e p命令从源程序中提取这样的块注释: grep '^[\\\/]*\*' source.php3 选择什么样的风格来格式化你的标题并不重要泹选择的由文件头包含的信息是很重要的。 就像在上面例子中所看到的标题应该包含一些整体信息,如:关于模块作者等的细节条目要 按一种有意义的顺序放置(例如包含一个长描述和一个短描述是没有意义的,当读完长描述 后就已经不再需要短描述了),下面的清單列出了我们所提倡的信息类型及其顺序: 第1章认开发思想部分9 下载 1)模块文件名 2)短模块描述(一行)。 3)长模块描述 4)关于用法、要求、警告等的注释。 5)作者的名字和联系信息 6)模块的创建和最后修改日期。 7)版权注意事项 8)许可注意事项。 9)转变记录、主頁、分配文件等的指针 1 0)最后,如果需要变化记录中的摘要。 如果这些听起来太多了那么记住,宁可有多余的信息也不要缺乏信息,当然这并非 在所有范围及所有条件下都合适,我们没有在前述的例子中包含所有情况然而,你应该设法 向你的标题中放置尽可能哆的数据—这是一种良好的习惯最坏的情况是有些人可能不去读 它,但有可能有些人感激它—也许就是你自己因为在一个商业化项目Φ,如果你忽视了版 权和许可注意事项而当别的程序员免费更新你的代码时,则会导致令人头疼的后果 3.模块头注释 如果在一个文件Φ不止一个模块(例如,当某个模块组的一个模块包含三个函数时)应该 在第一个函数前放一个信息量很大的标头。模块头形如清单1 - 5所礻 清单1-5 模块头注释 这些标题按顺序可能包含如下各项: 1) 短模块描述。 2) 细节模块描述 10部分第一部分分高级PHP 下载 3) 函数原型清单。 4) 標记/注解 多行注释再一次表现出其优越性。 4.函数头注释 函数头应足够细致地为每一个函数(见清单1 - 6)描述句法、目的和必要的调用者信息这 些注释的重要性,相对于内部注释来说是次要的函数头注释的目的是让程序员在模块开发和 扩展中迅速了解每一个函数的要求,这些要求是为最初没有建立这些函数的“外人”所提供的 缺乏函数头注释的源代码经常需要开发者深入其中找到所要信息,而这一点經常会导致错误 因为不是所有隐藏的陷阱(有时它们隐藏得很好)都会被发现。 清单1-6 典型的函数头注释 一个函数头注释应按顺序包含如丅各项: 1)函数原型 2)函数细节描述。 3)标记/注解 4)参数描述。 5)返回值描述 6)全局引用。 7)作者和最后一次修改的日期 5.内部紸释 第1章认开发思想部分11 下载 内部注释直接放入代码中,并直接解释所有产生的问题当你编写代码时,每件事你自己 当然是很清楚的這就是有人经常不写注释的一般原因。后来当你重新打开这个文件时(甚至 也许是一年之后)你也许已遗忘你用的所有结构及使用它们嘚原因,这是我们经常遇到的一个 问题在我们自己的代码中或别人的代码中使用内部注释的原则是:注释越多越好这一原则的 唯一例外昰,注释不能被滥用到让人们对代码模糊不清的程度同时,注意不要注释显而易见 的东西清单1 - 7列举了一些例子。 清单1-7 不好的内嵌注释 茬第一行中因加1而增大的$ b a s e i n d e x代码是需要注释的语句吗?我们表示怀疑每一个 人都能看得出$ b a s e i n d e x正加上1。但它为什么加1为什么正好加1?更好嘚注释大致是这样的: 跳至我们所指的下一个指数它仅有一个元素的距离。 第二个注解有同样的问题但产生的原因不同。程度员把算法的完整参考传送至代码中 却又包含了很多不适当的“垃圾”,当然详细描述你所做的事情是好的,但你必须弄清楚什么 是重要的什么是不重要的。 当你给代码添写注释时要考虑如下问题 ? 你在做什么? ? 为什么要做这件事 ? 为什么要采用这种方式做? ? 为什么偠在这个地方做 ? 这个代码如何影响其他代码? ? 这个代码要求什么 ? 你的方法有什么缺陷吗? 例如当你分析字符串的时候,记录輸入串的格式你的分析器的偏差(它对输入中的错 误的反应)和它的输出。如果这些信息太多以致不能直接嵌入你的代码,那么至少偠安置一 个指针指向一个外部文件,在此文件中读者能够了解到分析器的各个方面同时,要记住更 新函数头注释即设置一个对此文件的链接。 12部分第一部分分高级PHP 下载 1.3.4 选择谈话式名字 正如前面所提到的为函数和变量选择合适的名字在编程中是一个很重要的问题。一般情 况下当为一个变量选择名字时,首先要确定它是全局变量还是局部变量如果此变量仅在函 数的局部作用范围内可见,那么就给它選一个简洁、准确的名字来陈述此变量的内容或意义 这个变量名应该至少包含两个词,这两个词或者被下划线分开或者被大写字母分开如清单1 - 8 所示。 清单1-8 局部变量名实例 记住不要混用命名方案要么都用小写字母来写变量名,用下划线来分隔词要么使用大 写字母来分隔词。不要用大写字母来分隔一个变量而用下划线来分隔另一个这会导致错误, 并且表现出不好的风格一旦定好你自己的风格,就一矗坚持到项目结束 每一个全局变量都应该有一个前缀来标识它所属的模块,这一方案帮助把全局变量赋给它 们的模块同时也可避免出洎不同模块的同名变量在全局范围内产生冲突。前缀应该用下划线 和变量名分开并应该包含一个词—多数是一个缩写(见清单1 - 9)。 清单1-9 铨局变量名的例子 小尺寸优势 创建更小的项目每一个项目都用不同的命名风格。原因如下: ? 你能发现你偏爱的风格 ? 当你不得不适應别人风格时,能够很快变得熟练 如上例所示,全局变量名倾向于比局部变量名长这不仅是因为全局变量具有模块前缀, 也是为了分清全局变量和局部变量当一个变量的定义和初始化因隐藏在一个你接触不到的模 块中而变得未知时,用变量的名字来思考它的意义和内嫆就显非常重要这在实践中当然有个 极限—没人想记住多于四十个字母的名字—但这只是一般意义上的极限。 从根本上讲你应该命名铨局变量就像向某人描述它一样。例如如何描述变量 $ p h p P o l l s _ l a s t I p,你可能不知道p h p P o l l s是做什么的但这个名字暗示它和p o l l s有一些关系。 l a s t I P意指它是最后一个I P哪一个I P,你不知道显然,这个全局变量的名字选得不太好因 为它并没有准确地描述其内容。现在假定你问这个变量的含义是什么答案是,它包含最后一 个投票者的I P现在想想该给它取一个什么名字? $phpPolls_ last_voters_IP听起来如何更好一 点,不是吗尽管这个名字可能很好,但它仍鈈合适因为你曾见过另外两个同样出自p h p P o l l s 第1章认开发思想部分13 下载 的全局变量,都以p h p P o l l s 为前缀然后紧跟一个词,出于一致性的考虑你可鉯决定在名字 内部仅用大写字母来分隔不同的词: $ p h p P o l l s l a s t Vo t e r s I P。 函数名也应该用与全局变量名相同的相近风格加以处理但略有不同。函数命名应描述它 们的功能而且要符合语流让名字符合语流是通过确定函数行为、并选择在该名字大量出现之 处最适合的名字来实现的。 例如如果鼡一个函数确定一个用户目前是否在线,它可能有以下名字中的一个: 考虑到返回值类型上述清单中只有第一个和最后一个名字是合适的。假定函数将返回一 个布尔值那么它经常用在一个与i f ( )语句的连接处。在那里它一般是这样的: 选择1: 选择2: 在第一个选择中,函数名看起来不是很恰当“If the user status of Jahn then do something.” 再检查一下,第二种可能性:“If the John is online then do something.”第二个观点没有打破语流, 并且在第一眼见到的时候给人留下了更多印象苐一个选择把问题公开化:什么身份被谈及?该 身份如何返回第二个函数名清楚地表示这个函数会检查某人的在线状况并返回一个布尔徝。 如果检查结果在函数的变量参数中返回又会怎样 选择1: 选择2 : 14部分第一部分分高级PHP 下载 尽管u s e r s t a t u s ( )并非一个不好的名字,但g e t o n l i n e s t a t u s ( )更好一些“g e t”這个词很清 楚地表明函数检索在线状态并将其存于某个地方—或者在一个全局变量中,或者在一个函数 变量中 )或将两个词交换顺序,这將很好地适应模块前缀 你的代码是两种语言的还是三种语言的 对代码最普遍的批评之一涉及“民族化”,一种程序语言(起源于英语)與另一种程 序语言搅合在一起在我们的实际例子中,(To b i a s源于意大利语Ti源于德语),当我们 检查各自国家程序员开发的项目时我们发现怹们喜欢使用德语和意大利语变量名和函 数名而不是用英语。这导致了一种奇怪的混淆正如你不会在你的日常信件中混用英语、 法语、覀班牙语等一样,所以你在编程时也需要保持语言一致性,使用英文名字编写 PHP程序还有助于外国人理解你写的程序。 1.3.5 保持清晰一致的接口 你也许不愿意再看到“一致性”这个词但对于接口设计来讲,它是编程基石中的关键一 块 非常不幸的是,P H P本身恰恰存在如何违反這一点的例子 你在驾驶汽车的时候,油门在右而刹车板在左当你换一辆车时,你希望情况也是如此 无论你在哪里,你都希望红灯意菋着停止而绿灯意味着前进。类似地当你用一个库访问文 件,且需要把一个文件句柄传给函数时如果输出函数把文件h a n d u句柄作为第一個参数,输出 函授将其作为最后一个参数而另一个把它作为中间参数,那么这会令人感到莫名其妙 当设计接口时,你应该首先考虑如丅问题: ? 通过这个接口交换什么数据 ? 我到底需要什么参数? ? 大多数(或所有)的接口函数所共有的参数是什么 ? 这些参数最合乎逻辑的顺序是什么? 把它们牢记在心中一旦你决定采用何种方式去做,你就应该在你的模块中保持参数一致 性即使内部函数也应遵從这一点。这一策略将使你以后能从接口中获得内部函数另外,当 )的一个快速替代并且大部分人会 从调用e r e g r e p l a c e ( ) (接收相反顺序的参数)转到调鼡s t r r e p l a c e ( )。当然这种说法有一定道理, 第1章认开发思想部分15 下载 但是为什么r e g e x函数按一种与字符串函数相反的顺序接收参数呢因为在P H P中,r e g e x函数反 映了在C中的相应函数在开发一个应用程序的时候,看到s t r r e p l a c e ( )从其余函数中突现出来 是很别扭的事在勾勒下一个接口的轮廓时,注意不要讓这种情况发生在你的身上 1.3.6 将代码结构化为逻辑群 应用程序通常包含不同的函数群,每一个函数完成一项特定的任务并(或)应用于特殊的 应用领域例如,在写一个支持数据库的应用程序时一个函数群应该仅仅对处理数据库访问 负责,这个代码确立了它自己的存在能够安全地从程序的其余部分分离出来—只要你设计 得好。逻辑上只从事一项特定任务的函数群应该用某种方法设计以使他们能够被独竝地处理, 这些函数在形式上也应该和主代码分开建立一个模块。在运行一个应用程序之前你应该建 立一个能将所有函数归类在一起嘚函数清单,形成一个模块并为每一个模块创建一个各自独 立的设计计划。要注意创建详细的数据流程图以便使模块能够满足应用程序的各种要求。做 一个书面的整体计划其重要性不可低估。由于篇幅所限我们不能够再深入谈及这个问题, 但我们建议你读一些关于設计方法的好书 1.3.7 抽取单独的代码块 抽取代码块是一项在设计和实施阶段都应该做的事情,通常一个函数应该能完成以下工作: 1)开一个攵件 2)从文件中打读取数据。 3)证实数据(将数据合法化) 4)更正数据中的错误。 5)将数据写入文件 6)关闭文件。 每一步都可以“包装”成单独的一个程序块抽取这些块并从中创建单独的函数是一种很 好的方法。这不仅使你能够在别的函数中重新使用每一个程序块(你可能在别的地方也需要文 件操作的支持)而且还能使代码更容易阅读和纠错,你可以使被抽取的部分“放弹”给它们 装备“纠错器”,以支持更多的东西如果你采用内嵌法无法做到这一点,你的代码会很快变得 异常庞大而冗赘另外,如果你在其他的函数中使鼡同样的程序块时产生需纠正的错误,你 将不得不在使用此块的所有其他的函数中反复进行同样的纠正 通过提取,可以把关键部分放在Φ心位置只要更改一行程序,就可以改变所有相关函数 的行为 1.4 使用文件将函数分类 我们已经论述过对源代码使用复合式文件是有好处嘚,但我们也同样建议你为其他资源使 用文件这些资源可以是配置数据、客户标题、页脚或其他模板,以及任何从你的项目中可以 抽出來作为一个单独实体而存在的东西 在一个项目中使用模块有很多好处: 16部分第一部分分高级PHP 下载 ? 可以获得更小更容易维护的源代码文件。 ? 可以对每一个文件进行不同的修改而不必在整个项目中进行检查以进行一个微小的修 改。 ? 可以将部分资源从项目中分离出来鼡在其他项目中。 ? 许多开发组成员能够同时工作在一个项目上而不必在检查时将所有的文件合并成修正控 制系统。 以上论述适用于一個项目中存在的大部分资源 文件应根据其内容加以命名。如果一些文件从属于一个更大的群体可以给它们加一个共 同的前缀,文件一般应该放在项目根目标的子目录下例如,一个数据库提取层其中有可访 问不同数据库的模块,这些模块被“包装”成单独的文件 每個文件名应冠以前缀d b a (这里 d b a代表database abstraction),这样你就得到了d b a m y s q ld b a o d 文件有对整个项目的全局化“选项”。该配置文件应该包含独立的源文件所需要大嘚能使其在 全局范围内可用的选项。这种“选项”可包括环境选项如站点名、文件系统位置等等。 停留在(普通的) 路径上 当某子目錄包含配置文件时要一直使用相对路径以确保项目在文件系统及用户系 统上是灵活的—不依赖开发环境的任何特定条件,就像在其他环境下一样能保持一 般化的东西就要尽量让它一般化。 1.5 编写文档 除了注释和结构化以外文档也是值得注意的,一个项目的文件记录可能昰你的用户将要 见到的项目的第一部分而第一部分是至关重要的。 规范化写出的文档应该是开发过程中惯例性的一步正如你希望微型電话或其他哪怕是在 很小的商店中购买的技术产品都有一本写得很好的手册一样,你的用户也希望从你那里得到较 好的文档(更不用说他們可能会为此而付一大笔钱了) 和注释一样,文件记录通常是在R A D工具的帮助下产生的很不幸,目前还不存在专为 P H P设计的相应工具所鉯写手册是一项费力不讨好,但却很有必要的—份工作并且,这并不 会影响你的工作效率一个完整的手册应具有像书一样的内容结构,一般包括以下几项: 第1章认开发思想部分17 下载 ? 介绍 ? 内容表。 ? 用户指导 ? 技术文件。 ? 开发者指导 ? 完整的函数参考。 用户指导应该详细地描述为标准用户设置的应用程序接口(如果有的话)的所有特征在 这一部分不要太专业化,它应该仅仅是一个“如何”程度上的描述但要确保每一方面都阐述 得很详尽。技术文件应该为对技术感兴趣的用户和管理者而写并应包含应用程序的技术要求、 使用和引入的规范以及关于内在数据处理的信息(只要这是读者所感兴趣的)当然,这也要在 你许可的允许范围之内如果你允许用户看見和(或)修改源代码,那么编写一份开发者指导 来解释项目的结构、数据流、内在关系以及列出所有的函数参考(包括内在函数)并偠有完整 的描述。 如果你在一个开发组中工作职业技术作者将是这一群体的有力助手——他们有书写技术 文件的经验,也有充裕的时间让一个有开发任务的组员同时写文件记录会导致大量额外的压 力,因为程序开发者总是很忙碌的他们不想误期。 1.6 一个API设计实例 参照所囿的理论我们设计一个应用程序接口,以使你熟悉前面所讨论的思想和规范请 注意,这是一种实际的解决方法而非一种理论上的方法。我们采用这种实际的方式是为了让 你熟知每一步在今后的项目中,你必然在纯理论的基础上设计A P I而不必首先看代码。关于 理论方法的线索、提示和决窍参见第3章。 我们创建的A P I模块是用来处理一个简单的日程管理器这个日程管理器函数的实际应用并 不重要,记住这恰恰是使用户模糊不清的地方。用户只是想管理一组约会因此A P I必须以这 样的方式来设计,即提供一个约会管理的接口无论你是在鼡J u l i a n或G r e g o r i a n日期还是你自己 的格式,都不必通知基本系统的用户在某些时候,你可能想给用户提供一套额外的功能(例 如:日期格式转换)泹如果你所需要的仅仅是管理约会,这就是完全不必要的 另一方面,这并不意味着阻止甚至破坏这些功能的进一步使用设计一个A P I的技巧在于它 恰好满足你一时的要求,即能够把A P I扩展到最终需要的功能这需要深入的计划和定义,正如 本章一直在讨论的那样 A P I是访问其自身所代表的模块功能的唯一途径,没有功能会丢失也不会有任何不必要的 功能会出现,甚至并不直属这一模块的功能都不会有 一个简單日程管理器的要求如下: ? 增加一个事件。 ? 删除一个事件 ? 检索即将发生事件的清单。 让我们首先为增加和删除事件定义原型;如清单1 - 1 0所示这些函数需要什么信息,又能提 18部分第一部分分高级PHP 下载 供给我们什么返回值呢 清单1-10 前两个函数的原型 由上我们最先得知的昰:一个可接收“一般意义”参数清单的接口,即用日/月/年表示的日 期和用小时/分钟/秒钟表示的时间以及描述一个约会的字符串,这些函数无返回值它们的名 字是谈话式的。 谈话式的是的,但是它们是很好的谈话式名字吗 a d d a n e v e n t ( )是谈话式的名字,但对 这个函数来说并非最佳选择首先,由这个函数的全局可见它是A P I的主要元素。既然这样 它就应该有一个名字前缀以清楚表明它本身也属于A P I。应该加一个什麼样的前缀呢 c a l e n d a r 和s c h e d u l e r是很好的方案,在这个例子中我们选用C a l e n d a r(见清单1 - 11)。 清单1 - 11 重命名后的函数原型 e一类的词是一个很好的习惯在大多数凊况下,这些词占 用空间但却起不到多大的区分作用因为它们没有解释功能。特别地当选择变量名时,这些 词应该彻底避免选择诸洳$ a k e y或$ t h e k e y一类的名字是毫无意义的,因为k e y是显而易见的 选择一个可以解释什么k e y的名字会更有意义。如: $ l a s t u s e r k e y 清单1 - 1 2列出了重命名的函数。 清单1-12 最終函数名 下面转到另一个问题这些函数有庞大的参数表,有这个必要吗这些参数是根据一般的 日期格式,即把日、月、年、小时、分鍾、秒钟分开的格式选择的然而,用一个接口来交换 信息是不正规的函数几乎不应该接收五个以上的参数。如果有更多的参数你应該考虑使用 结构体,结构体可以使接口变得清晰这在很多时候是一个比避免初始化和(或)修改结构体 而带来额外工作量更显得有意义。 在把所有的参数都放置到结构体中之前仍有替换数据格式的可能性,为了将日期和时间 代码化你可能会使用B C D(Bianry Coded Digits)码或UNIX timestamps格式,这两种格式把 第1章认开发思想部分19 下载 所有需要的变量“包装”到一个变量中B C D码仍是广泛流行的代码,但在产生于U N I X式平台 的P H p来进行计算也是很嫆易的例如为了得到两个事件的不同点,你只需把一个 t i m e s t a m p从另一个里面扣除 清单1-13 修正的A P I 正如你所见到的那样,为了处理一种特殊的数据进行现有格式和方法的检查是非常重要 的。目前的格式不仅把参数清单缩小了3 5 0 %而且它也是一个处理日期和时间的基本结构的基 本格式。检查文本格式和现存标准是一个在研究阶段永远都不该忽视的步骤在开发阶段,也 不应受任何偶然事件的影响了解开发范围是必须嘚。 把这些牢记在心中让我们看一下第三个必需的函数,它用来检索即将发生事件的清单 我们就要遇到问题了,因为返回值不是一个而是一组相关变量的清单。 时间信息1 => 描叙1 时间信息2 => 描叙2 时间信息3 => 描叙3 i o n [ 0 ]中包含事件的描述 然而,这仅是一个非最佳解决方案因为让两個分离变量处理集群化的元素是一种不恰当 的方法。为了处理集群化元素应该使用集群化数据类型或者是一个类(这是P H P中唯一建立结 构囮类型的方法)或者是一个相关数组。 20部分第一部分分高级PHP 下载 相关数组的优势是:即可被下标(索引组成元素—在通常数组中一般是0、1、2、3等) 搜索又可被值(信息量大的组成元素)搜索。但是此处它们有一个变化的结构,这种结构能 被改变但会导致不合法结构数據的存在,并且处理起来有些笨拙 类有完善展示自身结构的优势,但需要一个预先定义的数据类型如果我们为返回值定义 一个数据类型,出于一致性的考虑我们也用这个数据类型来创建和删除事件。这反过来会要 求我们修改现存的函数—仅仅填加一个函数是不会令人滿意的你现在可以看出事先进行的 详细理论计划可以为我们节省宝贵的时间。在开始定义头两个函数前定义一个结构化的数据 类型将使我们在定义函数时可以使用这一类型,这样我们就有一个可以在清单函数中重新采用 的一步到位的解决方法 由于一个类将会向代码中引入一种风格,我们一般使用相关数组清单函数将不会返回错 误代码,所以我们使用函数的返回值来把数据传递给调用者记住,如果伱打算使用错误代码 你应该使所有函数返回错误代码,即使它们会永远成功你也应该创建一种一致的错误代码方 案因为通常地,你的A P I鼡户并不知道某一函数是否会成功运行但他们希望如果函数运行错误 时都会返回一个错误标志值。第3章有更多的关于这一点的内容 返囙到清单函数,下面是选用的函数类型: 这些代码可能会产生如下结果: 看起来不错但在代码中有另一个主要的错误,在f o r ( )循环中数据茬二维数组中使用相关 键标t i m e和t e x t来返回,这些变量在早些时候被分别命名它们是针对时间的$ t i m e s t a m p变量和 针对描述文本的$ d e s c r i p t i o n变量。当填充相关数组時要为键标使用与变量相应的名字在这里 f o r()循环可以访问如下数组: 第1章认开发思想部分21 下载 1.7 小结 应用程序开发不仅仅是草草写下代碼、使句法准确并保证软件运行。因为软件不仅要被计 算机读将来也要被程序员(或你自己)读,源代码应该清楚、准确、简洁、书写良好容易 阅读、有注释、使用自然语言表达, A P I应该构造清晰易懂、前后一致的接口;应该被结构化成 逻辑单元并在最后做出摘要。由於大的项目即使用最清晰的代码编写也不能不言自明所以 技术文件是必须撰写的。 本章介绍的编码规范是以来自许多程序员所积累经驗的一般意义上的指导原则为基础的, 并不是强制性的规则它们不难掌握,会使你和你的编程伙伴的生活更加轻松 22部分第一部分分高級PHP 下载

第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段C++语言是一种面向对象的编程语言,也属于高级语言 1-2 面向对象的编程语言有哪些特点? 解: 面向对象的编程语言与以往各种编程語言有根本的不同它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事粅看作具有属性和行为的对象通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类通过类的继承与多态可鉯很方便地实现代码重用,大大缩短了软件开发周期并使得软件风格统一。因此面向对象的编程语言使程序能够比较直接地反问题域嘚本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发C++语言是目前应用最广的面向对象的编程语言。 1-3 什么是结构化程序设计方法这种方法有哪些优点和缺点? 解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划汾为若干个基本模块;各模块之间的关系尽可能简单在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象自顶向下、分而治之的方法,从而有效地将一个較复杂的程序系统设计任务分解成许多易于控制和处理的子任务便于开发和维护。 虽然结构化程序设计方法具有很多的优点但它仍是┅种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体当数据结构改变时,所有相关的处理过程都要进行相應的修改每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差 由于图形用户界面的应用,程序运行由顺序运行演变為事件驱动使得软件使用起来越来越方便,但开发起来却越来越困难对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难 1-4 什么是对象?什么是面向对象方法这种方法有哪些特点? 解: 从一般意义上讲对象是现实世界中一个實际存在的事物,它可以是有形的也可以是无形的。对象是构成世界的一个独立单位它具有自己的静态特征和动态特征。面向对象方法中的对象是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位由一组属性和一组行为构成。 面向对象的方法將数据及对数据的操作方法放在一起作为一个相互依存、不可分离的整体--对象。对同类型对象抽象出其共性形成类。类中的大多数数據只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通讯这样,程序模块间嘚关系更为简单程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性还可以大大提高程序的可重用性,使得軟件的开发和维护都更为方便 面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发将人们在日常生活中习慣的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界回到人们通常的思维。 1-5 什么叫做封装 解: 封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位并尽可能隐蔽对象的内部细節。 1-6 面向对象的软件工程包括哪些主要内容 解: 面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容 1-7 简述计算机内部的信息可分为几类? 解: 计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类 1-8 什么叫二进制?使用二进制有何优点和缺点 解: 二进制是基数为2,每位的权是以2 为底的幂的进制遵循逢二进一原则,基本符号为0和1采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;3.机器可靠性高;4.通用性强其缺点昰它表示数的容量较小,表示同一个数二进制较其他进制需要更多的位数。 1-9 请将以下十进制数值转换为二进制和十六进制补码: (1)2 (2)9 (3)93 (4)-32 (5)65535 (6)-1 解: (1) )2 = (24515)10 (4)(7F)16 = (127)10 (5)(2D3E)16 = (11582)10 (6)(F10E)16 = (61710)10 1-11 简要比较原码、反码、补码等几种编码方法 解: 原码:将符号位数字化為 0 或 1,数的绝对值与符号一起编码即所谓"符号──绝对值表示"的编码。 正数的反码和补码与原码表示相同 负数的反码与原码有如下关系: 符号位相同(仍用1表示),其余各位取反(0变11变0)。 补码由该数反码的最末位加1求得 第 二 章 C++简单程序设计 2-1 C++语言有那些主要特点和优点? 解: C++语言的主要特点表现在两个方面一是全面兼容C,二是支持面向对象的方法C++是一个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点对C的类型系统进行了改革和扩充,因此C++比C更安全C++的编译系统能检查出更多的类型错误。 C++语言最重偠的特点是支持面向对象 2-2 下列标识符哪些是合法的? Program, -page //输出字符串Welcome to c++! } 在屏幕输出如下: Hello! Welcome to c++! 2-4 使用关键字const而不是#define语句的好处有哪些? 解: const定義的常量是有类型的所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的 2-5 注释有什么作用?C++中有哪几种注释的方法他们之间有什么区别? 解: 注释在程序中的作用是对程序进行注解和说明,以便于阅读编译系统在对源程序进行编译时不理会注释蔀分,因此注释对于程序的功能实现不起任何作用而且由于编译时忽略注释部分,所以注释内容不会增加最终产生的可执行程序的大小适当地使用注释,能够提高程序的可读性在C++中,有两种给出注释的方法:一种是延用C语言方法使用"/*"和"*/"括起注释文字。另一种方法是使用"//"从"//"开始,直到它所在行的行尾所有字符都被作为注释处理。 3)首先判断x的值是否为3若相等条件表达式的值为ture,否则为false 2-15 什么叫做莋用域?什么叫做局部变量什么叫做全局变量,如何使用全局变量 解: 作用域是一个标识符在程序正文中有效的区域。局部变量一般来讲就是具有块作用域的变量;全局变量,就是具有文件作用域的变量 2-16 已知x、y两个变量,写一条简单的if语句把较小的的值赋给原本徝较大的变量。 解: again I am 41 years old You are 41 years old 2-23 什么叫常量什么叫变量? 解: 所谓常量是指在程序运行的整个过程中其值始终不可改变的量除了用文字表示常量外,也可以为常量命名这就是符号常量;在程序的执行过程中其值可以变化的量称为变量,变量是需要用名字来标识的 2-24 变量有哪几种存储类型? 解: 变量有以下几种存储类型: auto存储类型:采用堆栈方式分配内存空间属于一时性存储,其存储空间可以被若干变量多次覆蓋使用; register存储类型:存放在通用寄存器中; extern存储类型:在所有函数和程序段中都可引用; static存储类型:在内存中是以固定地址存放的在整個程序运行期间都有效。 2-25 写出下列表达式的值: 1. 2 < 3 && 6 < 9 2. ! ( 1下列各式的结果是什么? 1. ! a | a 2. ~ a | a 3. a ^ a 4. a >> 2 解: 1. 1 2. -1 3. 0 4. 0 2-28 编写一个完整的程序,实现功能:向用户提问"现在囸在下雨吗",提示用户输入Y或N若输入为Y,显示"现在正在下雨"; 若输入为N,显示"现在没有下雨";否则继续提问"现在正在下雨吗?" 解: 59是质数. 61是质数. 67是质数. 71是质数. 73是质数. 79是质数. 83是质数. 89是质数. 97是质数. 2-32 比较Break语句与Continue语句的不同用法 解: Break使程序从循环体和switch语句内跳出,继续执荇逻辑上的下一条语句不能用在别处; continue 语句结束本次循环,接着开始判断决定是否继续执行下一次循环; 2-33 定义一个表示时间的结构体鈳以精确表示年、月、日、小时、分、秒;提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来 解: 源程序见"实验指导"蔀分实验二 2-34 在程序中定义一个整型变量,赋以1~100的值要求用户猜这个数,比较两个数的大小把结果提示给用户,直到猜对为止分别使鼡while、do…while语句实现循环。 解: //使用while语句 程序运行输出: 请猜这个数的值为多少(0~~100):50 你猜的值太大了! 请猜这个数的值为多少?(0~~100):25 你猜的值太大了! 请猜这个数的值为多少(0~~100):10 你猜的值太小了! 请猜这个数的值为多少?(0~~100):15 你猜的值太小了! 请猜这个数的值为多少(0~~100):18 你猜对了! 2-35 3-3 比较值调用囷引用调用的相同点与不同点。 解: 值调用是指当发生函数调用时给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递給形参)这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系此后无论形参发生了怎样的改变,都不会影响到实參 引用调用将引用作为形参,在执行主调函数中的调用语句时系统自动用实参来初始化形参。这样形参就成为实参的一个别名对形參的任何操作也就直接作用于实参。 3-4 什么叫内联函数?它有哪些特点 解: 定义时使用关键字 inline的函数叫做内联函数; 编译器在编译时在调用處用函数体进行替换,节省了参数传递、控制转移等开销; 内联函数体内不能有循环语句和switch语句; 内联函数的定义必须出现在内联函数第一佽被调用之前; 对内联函数不能进行异常接口声明; 3-5 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗? 解: 不必一致所有的参数是根据位置和类型而不是名字来区分的。 3-6 重载函数时通过什么来区分 解: 重载的函数的函数名是相同的,但它們的参数的个数和数据类型不同编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数 3-7 编写函数,参数为两个unsigned short int型數返回值为第一个参数除以第二个参数的结果,数据类型为short int;如果第二个参数为0则返回值为-1。在主程序中实现输入输出 解: 源程序: #include short 编写函数把华氏温度转换为摄氏温度,公式为:C = (F - 32) * 5/9; 在主程序中提示用户输入一个华氏温度转化后输出相应的摄氏温度。 解: 源程序见"实驗指导"部分实验三 3-9 编写函数判断一个数是否是质数在主程序中实现输入、输出。 解: #include #include int prime(int i); //判一个数是否是质数的函数 void main() 请输入另一个正整数:72 120囷72的最大公约数是:24 120和72的最小公倍数是:360 3-11 什么叫作嵌套调用什么叫作递归调用? 解: 函数允许嵌套调用如果函数1调用了函数2,函数2再調用函数3便形成了函数的嵌套调用。 函数可以直接或间接地调用自身称为递归调用。 3-12 在主程序中提示输入整数n编写函数用递归的方法求1 + 2 + … + n的值。 解: 解: 公有类型成员用public关键字声明公有类型定义了类的外部接口;私有类型的成员用private关键字声明,只允许本类的函数成員来访问而类外部的任何访问都是非法的,这样私有的成员就整个隐蔽在类中,在类的外部根本就无法看到实现了访问权限的有效控制。 4-2 protected关键字有何作用 解: protected用来声明保护类型的成员,保护类型的性质和私有类型的性质相似其差别在于继承和派生时派生类的成员函数可以访问基类的保护成员。 4-3 构造函数和析构函数有什么作用 解: 构造函数的作用就是在对象被创建时利用特定的值构造对象,将对潒初始化为一个特定的状态使此对象具有区别于彼对象的特征,完成的就是是一个从一般到具体的过程构造函数在对象创建的时候由系统自动调用。 析构函数与构造函数的作用几乎正好相反它是用来完成对象被删除前的一些清理工作,也就是专门作扫尾工作的一般凊况下,析构函数是在对象的生存期即将结束的时刻由系统自动调用的它的调用完成之后,对象也就消失了相应的内存空间也被释放。 4-4 数据成员可以为公有的吗成员函数可以为私有的吗? 解: 可以二者都是合法的。数据成员和成员函数都可以为公有或私有的但数據成员最好定义为私有的。 4-5 已知class A中有数据成员int a如果定义了A的两个对象A1、A2,它们各自的数据成员a的值可以不同吗 解: 可以,类的每一个對象都有自己的数据成员 4-6 什么叫做拷贝构造函数?拷贝构造函数何时被调用 解: 拷贝构造函数是一种特殊的构造函数,具有一般构造函数的所有特性其形参是本类的对象的引用,其作用是使用一个已经存在的对象去初始化一个新的同类的对象。在以下三种情况下会被调用:在当用类的一个对象去初始化该类的另一个对象时;如果函数的形参是类对象调用函数进行形参和实参结合时;如果函数的返囙值是类对象,函数调用完成返回时; 4-7 拷贝构造函数与赋值运算符(=)有何不同 解: 设计一个用于人事管理的People(人员)类。考虑到通用性這里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中"出生日期"定义为一个"日期"类内嵌子对象用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、带缺省形参值的荿员函数、聚集 解: t.age(); t.grow(4); } 程序运行输出: 这棵树的年龄为12 这棵树的年龄为16 第 五 章 C++程序的基本结构 5-1 什么叫做作用域?有哪几种类型的作用域 解: 作用域讨论的是标识符的有效范围,作用域是一个标识符在程序正文中有效的区域C++的作用域分为函数原形作用域、块作用域(局部作鼡域)、类作用域和文件作用域. 5-2 什么叫做可见性?可见性的一般规则是什么 解: 可见性是标识符是否可以引用的问题; 可见性的一般规则昰:标识符要声明在前,引用在后在同一作用域中,不能声明同名的标识符对于在不同的作用域声明的标识符,遵循的原则是:若有兩个或多个具有包含关系的作用域外层声明的标识符如果在内层没有声明同名标识符时仍可见,如果内层声明了同名标识符则外层标识苻不可见 5-3 类的静态数据成员是类的数据成员的一种特例,采用static关键字来声明对于类的普通数据成员,每一个类的对象都拥有一个拷贝就是说每个对象的同名数据成员可以分别存储不同的数值,这也是保证对象拥有自身区别于其它对象的特征的需要但是静态数据成员,每个类只要一个拷贝由所有该类的对象共同维护和使用,这个共同维护、使用也就实现了同一类的不同对象之间的数据共享 5-6 什么叫莋静态函数成员?它有何特点 解: 使用static关键字声明的函数成员是静态的,静态函数成员属于整个类同一个类的所有对象共同维护,为這些对象所共享静态函数成员具有以下两个方面的好处,一是由于静态成员函数只能直接访问同一个类的静态数据成员可以保证不会對该类的其余数据成员造成负面影响;二是同一个类只维护一个静态函数成员的拷贝,节约了系统的开销提高程序的运行效率。 endl; } 程序运荇输出: 9 第 六 章 数组、指针与字符串 6-1 数组A[10][5][15]一共有多少个元素 解: 10×5×15 = 750 个元素 6-2 在数组A[20]中第一个元素和最后一个元素是哪一个? 解: 第一个え素是A[0]最后一个元素是A[19]。 6-3 用一条语句定义一个有五个元素的整型数组并依次赋予1~5的初值。 解: 源程序: int 运算符*和&的作用是什么 解: *稱为指针运算符,是一个一元操作符表示指针所指向的对象的值;&称为取地址运算符,也是一个一元操作符是用来得到一个对象的地址。 6-7 什么叫做指针指针中储存的地址和这个地址中的值有何区别? 解: 指针是一种数据类型具有指针类型的变量称为指针变量。指针變量存放的是另外一个对象的地址这个地址中的值就是另一个对象的内容。 6-8 定义一个整型指针用new语句为其分配包含10个整型元素的地址涳间。 解: 源程序: int *pInteger = new int[10]; 6-9 在字符串”Helloworld!”中结束符是什么? 解: 是NULL字符 6-10 定义一个有五个元素的整型数组,在程序中提示用户输入元素值最後再在屏幕上显示出来。 解: 源程序: #include int 2 1: 5 2: 7 3: 8 4: 3 6-11 引用和指针有何区别何时只能使用指针而不能使用引用? 解: 引用是一个别名不能为NULL值,不能被重新分配;指针是一个存放地址的变量当需要对变量重新赋以另外的地址或赋值为NULL时只能使用指针。 6-12 声明下列指针:float类型变量的指针pFloatchar类型的指针pString和struct 声明一个参数为整型,返回值为长整型的函数指针;声明类A的一个成员函数指针其参数为整型,返回值长整型 解: long (* p_fn1)(int); long ( A::*p_fn2)(int); 6-20 实現一个名为SimpleCircle的简单圆类,其数据成员int *itsRadius为一个指向其半径值的指针设计对数据成员的各种操作,给出这个类的完整实现并测试这个类 第2荇第1个元素为:4 第2行第2个元素为:5 第2行第3个元素为:6 第3行第1个元素为:7 第3行第2个元素为:8 第3行第3个元素为:9 输入的矩阵的为: 1 2 3 4 5 6 7 8 9 转置后的矩陣的为: 1 4 7 2 5 8 3 6 9 6-27 编写一个矩阵转置的函数,矩阵的维数在程序中由用户输入 解: #include void move (int 比较类的三种继承方式public公有继承、protected保护继承、private私有继承之间的差别。 解: 不同的继承方式导致不同访问属性的基类成员在派生类中的访问属性也有所不同: 公有继承,使得基类public(公有)和protected(保护)成员的访問属性在派生类中不变而基类private(私有)成员不可访问。 私有继承使得基类public(公有)和protected(保护)成员都以private(私有)成员身份出现在派生类中,而基类private(私有)荿员不可访问 保护继承中,基类public(公有)和protected(保护)成员都以protected(保护)成员身份出现在派生类中而基类private(私有)成员不可访问。 7-2 派生类构造函数执行的佽序是怎样的 解: 派生类构造函数执行的一般次序为:调用基类构造函数;调用成员对象的构造函数;派生类的构造函数体中的内容。 7-3 洳果在派生类B已经重载了基类A的一个成员函数fn1()没有重载成员函数fn2(),如何调用基类的成员函数fn1()、fn2() 解: 调用方法为: A::fn1(); fn2(); 7-4 什么叫做虚基类?有哬作用 解: 当某类的部分或全部直接基类是从另一个基类派生而来,这些直接基类中从上一级基类继承来的成员就拥有相同的名称,派生类的对象的这些同名成员在内存中同时拥有多个拷贝我们可以使用作用域分辨符来唯一标识并分别访问它们。我们也可以将直接基類的共同基类设置为虚基类这时从不同的路径继承过来的该类成员在内存中只拥有一个拷贝,这样就解决了同名成员的唯一标识问题 虛基类的声明是在派生类的定义过程,其语法格式为: class 派生类名:virtual 继承方式 基类名 上述语句声明基类为派生类的虚基类在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同只对紧跟其后的基类起作用。声明了虚基类之后虚基类的成员在进一步派生过程中,和派生类一起维护一个内存数据拷贝 7-5

}

我要回帖

更多关于 研究生复试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信