注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ocean's blog

平常心——可以寂寞,但不允许空虚

 
 
 

日志

 
 

C++百科  

2009-05-30 12:42:24|  分类: C++(转) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

【C++概述】

  C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”或者“dev.cpp"。 它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。 

  C++ 是C语言的一个高级版本,支持中文,界面高级,不需要启动母文件即可运行程序。

  美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1488-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISO C++。1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新将是在2009年,目前我们一般称该标准C++0x。遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2004年)只有少数几个编译器完全符合这个标准(这么说也是不完全正确的,事实上,至今为止没有任何一款编译器完全支持ISO C++)。 

  另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。

[编辑本段]

STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的naive代码低些,但是其安全性与规范性使它大受欢迎。

[编辑本段]

1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以LokiMPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

[编辑本段]

编辑本段]

编辑本段]

编辑本段]

微软VisualBasic和Java是众多公司产品体系的首选语言。对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。 

  传统上认为,C++相对于目前一些新潮的语言,如Java、C#,优势在于程序的运行性能。这种观念并不完全。如果一个人深信这一点,那么说明他并没有充分了解和理解C++和那个某某语言。同时,持有这种观念的人,通常也是受到了某种误导(罪魁祸首当然就是那些财大气粗的公司)。对于这些公司而言,他们隐藏了C++同某某语言间的核心差别,而把现在多数程序员不太关心的差别,也就是性能,加以强化。因为随着CPU性能的快速提升,性能问题已不为人们所关心。这叫“李代桃僵”。很多涉世不深的程序员,也就相信了他们。于是,大公司们的阴谋也就得逞了。 

  一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。这一点被多数人忽视,并且被大公司竭力掩盖。 

  语言在软件工程上的好坏,依赖于语言的抽象能力。从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。但在实践中,人们发现面向对象无法解决所有软件工程中的问题。于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。

[编辑本段]

魔兽世界》等几乎所有的网络游戏,百度搜索引擎(Baidu.com),我们所用的大多数软件都是用C++写的(硬件也有很多用到C++的)。

  C++之父Bjarne Stroustrup列举的C++应用:

  Amazon.com:Software for large-scale e-commerce

  Apple: OS X is written in a mix of language, but a few important parts are C++. The two most interesting are 

  AT&T:The largest US telecommunications provider. 

  o provisioning systems 

  o systems for rapid network recovery after failure

  Autodesk: A large number of major number of application in the CAD domain

  Ericsson:o server platform.

  o TDMA-CDMA HLR

  o GSM-TDMA-CDMA mobility gateway

  Google: web search engine, etc。

  HP: Here is a tiny fraction of HP's C++ apps: 

  o C, C++, Fortran90 compilers, and linker for the new HP IA64 platform (these add to more than 1 million lines of C++ code).

  IBM: o OS/400. 

  o K42: a high performance, open source, general-purpose operating system kernel for cache-coherent multiprocessors.

  Intel:o Vtune performace analysis software 

  o compilers and optimizers 

  o lots of chip design and manufacturing software

  JPL (Jet Propulsion Lab, NASA): Mars rover autonomous driving system (incl. scene analysis and route planning). C++ on Mars! Also lots of supporting software "on the ground" (i.e. Earth).

  Microsoft:o Windows XP 

  o Windows NT (NT4 and 2000) 

  o Windows 9x (95, 98, Me) 

  o Microsoft Office (Word, Excel, Access, PowerPoint, Outlook) 

  o Internet Explorer (including Outlook Express) 

  o Visual Studio 

  o SQL

  Mozilla: Firefox browser and Thunderbird mail client (open source)

  MySQL: MySQL Server (about 250,000 lines of C++) and MySQL Cluster. Arguably the world's most popular open source database

  Nokia: o Mobile Communications radio-station/internet bridges: FlexiGGSN (Gateway GPRS Support Node) and FlexiSGSN (Server GPRS Support Node). 

  o MSC/HLR 

  Sun: o The HotSpot Java Virtual Machine is written in C++

  Symbian OS: rationale: "[...] using C++ for all system code, from the kernel upwards." This is one of the most widespread OS's for cellular phones

  KDE from linux is written in C++.

  telephone systems: I think it would be almost easier to list the systems which aren't written in C++

  更详细的应用列表1:http://www.research.att.com/~bs/applications.html 

  更详细的工业列表2:http://www.lextrait.com/vincent/implementations.html

[编辑本段]

编辑本段]

编辑本段]

编辑本段]

编辑本段]

【21天学通C++】

  在这里我也想给大家一本书,就是陈龙等人编著的<<21天学通C++>>,2009年1月第一次印刷,是一本新书.这本书基本上是给刚入门的人写的,我也是刚入门的,我个人是感觉学得很轻松的,完全能够明白书中教的内容,这本书主要有以下的特点1.知识点介绍准确.清晰2.每个知识点后面都带有范例代码,每行代码者带有详细的解释3.每一章书的后面都提供简单的综合练习,答案在所提供的光盘中4.全书还穿插着一些技巧.提示等小贴士5本书配有光盘,光盘包括多媒体视频.电子教案.参考宝典电子书等..因为本书有很多优点,所以本书是很适合初学者的.

  21天学得通C++么?这是个问题。

  【C++名人坊】

  有两位Google Maps API的初学者向我请教他们按照最简单例子写的程序为什么不能正常的运行。

  其中一位用GTalk跟我交流,我仔细了看了他的代码,没看出问题,把代码保存在本地,打开Firefox的错误控制台,用Firefox打开他的页面。出错的那一行被清晰的显示出来,我再仔细端详那句话,原来有两个应该是英文逗号的地方,写上了中文逗号。

  另一位,在我的论坛跟我交流他的Google Maps API中遇到的问题,我看他代码的时候也没有马上发现问题。然而,同样在用Firefox打开后,问题很明显的找到了,原来是一个方法openInfoWindow被他写成OpenInfoWindow了。

  在我帮助别人解决的程序调试问题中,这是非常常见的。人人都可能打出中文逗号,人人都可能把大小写写错。但是在我帮助他们解决问题以后,他们总是感慨的说,谢谢我解决了这个问题,这个问题困扰了他们几个小时,甚至是几天。

  这其实并不是只有初学者才会遇到的问题,我还帮助过些有非常丰富经验的工程师解决问题,有时候问题仅仅出自某个参数没有传递进来,或者是拼接字符串的时候少些了一个冒号,或者是拼接地址的时候漏掉了http:。我甚至帮助一些人调试一些我根本不懂的语言的程序,因为多半出现的问题,都和语言特性无关,不是程序员写错了字符,就是写错了逻辑,或者是错误理解了一个函数。

  出问题是正常的,写程序是一个复杂的边思考边打字的过程,笔误和一时糊涂都是难以避免的。程序员一般把这种问题叫做低级问题,因为这类问题跟你的智商完全无关,任何人都可能犯。

  但是,问题在于,有时候即使是很优秀的程序员,也会被一个低级错误困扰,可能会几天都解决不了。所以,关键在于,如何找到问题。 

  遇到问题的时候:

  1,不要怨天怨地。出了问题,当然有可能是系统的bug,API的问题,但是那些几率往往比你犯低级错误的几率要低多了,先从自己身上找原因,是不是自己写错了。 

  2,要掌握工具。最低限度你要会写Log,最好是Log和调试器结合。好 的工具可以大大的提高效率。以前有人跟我说,Dll不能调试,我发现可以;有人说多线程不能调试,我发现可以;有人说COM不能调试,我发现可以;有人说 IE插件不能调试,我发现可以;有人说OE插件不能调试,我发现也可以。当然,你确实会遇到不能调试的时候,当年我们做东芝芯片的嵌入程序,一个组都没有 一个仿真器和调试器,但是至少可以用Log嘛,无非是麻烦点。

  3,分析问题要有逻辑。遇到问题可以先把所有的可能性都列出来,然后一个一个分析,肯定能找到原因的。

  4,要学会隔离问题。问题涉及到的代码越多,越难以理解,问题越难以解决。遇到这样的情况,可以利用Log或者调试器,一行代码一行代码的给它们洗清嫌疑,这样很快你就可以找到出问题的地方。如果代码特别长,程序特别复杂,可以用二分法来做,效率很高。

  5,千万不要懒惰,不要事事求别人。一次复杂的调试过程就像一部侦探剧,如果你有非常好的逻辑性,那这部剧的主角就是福尔摩斯,剧情一定非常精彩。我说这个是有巨大风险的,说真的我帮人调东西挺上瘾的,很有意思。但是我还是要告诉大家,一次高难度的调试之后,你的满足感绝对不亚于写了一个伟大的程序。

  要想不遇到问题,写代码的时候:

  1,要对写出来的代码负责。我很佩服那些写代码写100行都不执行一次的 高手,如果他们最后不被低级错误困扰的话我就更加的佩服了。我写程序几乎是写一行两行就要执行一次,每句话我都要确保执行效果跟我的预期一致。没错这样写的时候 可能慢一些,但是调试的时候很轻松,我可以很简单的确定哪些代码绝对没有问题。所以我写代码整体速度比一般人高。很多人学习新东西的时候喜欢把例子抄一遍,运行一下,改改,再运行。我喜欢一句一句的抄例子,抄一句两句执行一次,这样可以把例子透彻的理解,而且很难会遇到出现了问题找不到原因的时候。 

  2,函数体功能块不要过长。我认为我的智商并不高,我很难接受一个程序的一个函数体或者一个功能块超越3屏(当然逻辑真的有那么复杂除外,你会发现越是简单的逻辑越是容易被人写的冗长)。很多人对面向对象耳熟能详,对封装继承看起来驾轻就熟。但是动不动就写出来个函数体超长的程序。这就像写本书从头到尾不点句号一样,会累死读者的。自己看的时候,估计也会被累的喘不过来气。这是我对基础教育的微词所在,他们连教会学生写函数都没教会,虽然表面上他们连面向对象这么高深的东西都教。 

  3,缩进要对。这点很重要,虽然大部分语言不是像Python那样用缩进来决定逻辑块的位置,但是人看到缩进的时候,总是会以为这些缩进位置跟逻辑相关。尤其是在有大量的ifelse或者for循环等等的嵌套逻辑的时候,如果缩进错了,可能会直接让人把程序的逻辑读错。所以我拿到别人的代码,第一件事情就是整理缩进。我见过一些比较优秀的页面工程师,他们会在div结束的位置用注释写上这个div的id,这样层级关系就一目了然了。 

  4,不断重构。随着程序的不断修改,有些部分会不断的增长,原来看着清晰的架构可能因为问题的复杂而慢慢模糊,也可能被修正bug的权宜之计弄的面目全非。不信你找一个经过多次修改的程序看看,是不是满目疮痍,是不是都很难认出是你自己的作品了。这在多人参与的项目中更加严重,每个人有不同的代码风格,经过多次杂交后,你肯定认不出你的代码是骡子是马,还是四不像了。随着程序的慢慢成长,原来有些函数体会慢慢膨胀,需要拆分;有些原来简单的功能块四处都需要,应该被提炼成函数或者方法,等等。现在不重构,未来等到代码复杂到无法控制的时候,重构的工作就会变得更加困难。我见过最强的案例是,一个几千行的电子辞典配套联机软件,经过无数次的改版,变成了一个几乎无法维护的主窗体的cpp有1万8千行的怪物。最后经过复杂的重构,才变成一个出新版本只需要新增一个驱动程序的可以维护的几千行的程序。

  郝培强:银杏技术咨询创始合伙人,网名Tinyfool,技术方向是全文检索,搜索引擎优化,网站架构设计等。 银杏技术咨询的主要业务是帮助客户的网站改进技术,提高网站性能和反应速度,解决门槛性技术问题,从而提高用户满意度。 

  【CSDN独家专访】有的时候我们对一款产品表现出难以名状的喜爱之情,往往我们就会想像做出这样功能的程序员他应该是多么的伟大,是什么样的天才,对他就如同造物主一般的崇拜,所以很多人会把成为一个程序员作为自己的理想,然而很少有人会知道,在这样一款产品的背后,其实还有一个更加强健的团队在护送着他前行。 

  而这个团队的领军人物就是产品经理。近日,我们都很熟悉的暴风影音发布了它最新的3.1版本,这距离上次的3.0版仅过了45天。暴风影音做为一个日使用量在千万级别之上的客户端软件,产品里的任何一个角落有瑕疵,任何一个细节有Bug,被用户识别到的几率非常大,这和普通的应用软件是不能比的。所以需要做大量的用户反馈,数据分析,数据挖掘的工作,来提升软件本身的性能,那么,如果作为暴风影音的产品经理,他的身上又发生着什么样的故事呢?我们带着这样的好奇心采访了暴风影音的产品经理王志鹏。

  王志鹏是一个很健谈的人,但在倾听的时候却很真诚。“也许这就是做一名产品经理所必备的基本素质。”王志鹏对我们的赞赏这样回答道,“判断自己适不适合做一名产品经理,你需要为自己做一个这样的测试,如果有十个人分别提出了十种功能改进的方案,那么你是否能够发自内心的把这十套方案都耐心、认真的听完,并且能够真正领会到他们的意图,即使这其中有不切实际的方案、有令人哭笑不得的方案,但是如果你是有兴趣去做这件事,而且付出的都不会成为你的心理负担,那么你就具备了成为一名产品经理的基本素质”。

  在做产品经理之前王志鹏也是一名技术人员,他也很喜欢做技术,那么是什么让他实现了从一名技术人员到一名产品经理这样的一次转型呢?“其实我很早就立志我要做技术开发,大学毕业以后我在一家公司做ERP软件,由于ERP软件的特殊性,是需要跟很多的业务部门进行沟通来了解他们的运作状况之后才能够编写软件代码的,所以渐渐的我发现,我的编程技术或者说是一些技巧并不是最好的,但我是最懂得我们业务人员需求,最懂得他们要什么的人。”也许就是这样的一段时间,让王志鹏考虑了自己的特长可能会在这里有更好的发挥。

  也许就是凭着良好的沟通和理解能力,不久,王志鹏就被一家知名的国际软件厂商看中收入麾下,并担任项目管理的工作。“这段时间里我主要是在做项目甲方和乙方之间的桥梁,做时间、人员和资源方面的协调分配”王志鹏说,“在这段时间里我已经不做具体代码的编写工作了,这也让我有机会在抽离了具体的代码编写工作之后看清楚了一名技术人员在项目实施过程中会出现的问题,更重要的是让我深刻的体验到了这样的一家国际软件厂商他在软件产品生产的过程中积累下来的流程和规则,在这样的流程和规则下运作的软件生产活动,不管是谁都可以很好的完成高质量的产品”。也正是在这里,王志鹏完成了他的转型。

  “其实在这个转变的过程中,我也有过挫败感的时候。”王志鹏说,“曾经我认为从一个技术人员转型到产品经理是容易的,其实不然。在有过失败之后,我开始反思我这样的想法,非常幸运的是我找到了出口”。从王志鹏感悟中我们找到了转型过程中最核心的三点:

  1、敬畏之心。无论是技术人员面对产品经理还是产品经理面对技术人员,大家一定要抱有敬畏之心,要尊重和重视别人的意见,不要认为自己就是正确的,一个人提出任何一种想法一定是经过了思考的,不能单纯的认为这个想法“幼稚”、“不可能”,更多要想的是为什么他会有这种想法。

  2、主动沟通。技术人员和产品经理其实各自运行的是两套逻辑。技术人员在考虑问题的时候最先是从后台着眼,继而考虑架构然后开始编写代码的过程;而产品经理在考虑问题的时候首先是从用户开始,继而是用户体验、完全以市场驱动为主导。这样两种完全不同的思考方式造就了不同的工作习惯。

  程序员完全可以只考虑自己技术实现的这一部分,做到精美、高效那他就是一个合格的技术人员,而产品经理需要的是Open的方式,需要和不同的人沟通他们各自的感受,因为代码的对和错有明显的界限,而用户体验没有对和错,只有好和更好,而自己的习惯并不能代表大家习惯,所以要通过主动的沟通和倾听来知道各种各样的体验是怎样的。

  3、大量阅读。不仅仅要阅读相关专业类书籍更要有广泛阅读的习惯。因为这样能够培养人文的思维习惯,这也是单一研究理工科类的技术人员所欠缺的,编程需要逻辑思维的缜密,而阅读能够让你看事情的时候更换另一种逻辑,也让你的思维变得更加全面。

  获得成功是每个人都需要的,但是成功并没有一条可以遵循的路线可以走。并不是说程序员到了一个规定的阶段就一定需要转型,一定需要专向产品经理,或者一定需要出去创业。“我并不赞同每个技术人员都要考虑自己该如何转型,真正要考虑的是看请自己突出的特点在哪里。”王志鹏说,“在我们的工作过程中,并不是像升学考试一样,要一张桌子四条腿一样长,所谓的全面发展,如果数学能考120分,语文能考60分,而继续学数学就能考130分,同样的力气学语文可能可以靠90分,那毫不犹豫的应该去学语文;但是在工作中,如果我写代码能得80分的认可,做管理、做沟通能得60分的认可,而继续努力写代码就能到95分,继续努力尝试管理和沟通能得到80分,那么,奉劝大家还是要继续向95分的代码去努力。因为这就是你的特长,如果为了全面而放弃了你的特长,将是一个巨大的浪费。”

  王志鹏的经验令我觉得这应该就是社会分工的规律所在,每个人都有自己的角色,要认清的是自己的核心竞争力,而在这里木桶效应是失效的。如果要打破这种规律的话,那可能会付出很大的代价 。

  评论这张
 
阅读(77)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018