C++概论C语言过度版.doc

上传人:本田雅阁 文档编号:2725659 上传时间:2019-05-08 格式:DOC 页数:40 大小:104.50KB
返回 下载 相关 举报
C++概论C语言过度版.doc_第1页
第1页 / 共40页
C++概论C语言过度版.doc_第2页
第2页 / 共40页
C++概论C语言过度版.doc_第3页
第3页 / 共40页
C++概论C语言过度版.doc_第4页
第4页 / 共40页
C++概论C语言过度版.doc_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《C++概论C语言过度版.doc》由会员分享,可在线阅读,更多相关《C++概论C语言过度版.doc(40页珍藏版)》请在三一文库上搜索。

1、历史简介C语言之所以要起名为“C”,是取的“BCPL”的第二个字母(第一个字母用来命名之前被发明的B语言) 。当C语言发展到顶峰的时刻,出现了一个版本叫C with Class,那就是C+最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的+运算符来体现它是C语言的进步,故而叫C+,成立了C+标准委员会。美国AT&T贝尔实验室的本贾尼斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C+(最初这

2、种语言被称作“C with Classes”)。一开始C+是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、命名空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C+程序设计语言的国际标准ISO/IEC 1988-1998。C+是具有国际标准的编程语言,通常称作ANSI/ISO C+。1998年是C+标准委员会成立的第一年,以后每

3、5年视实际需要更新一次标准,下一次标准更新原定是在2009年,目前我们一般称该标准C+0x,但是由于对于新特性的争端激烈,除了在Technical Report 1(tr1)中的新增修改被基本确定外,完整的标准还遥遥无期。况且遗憾的是,由于C+语言过于复杂,以及经历了长年的演变,直到现在(2010年)都没有有一个编译器完全符合这个标准。据Herb Sutter报告,C+0x最终国际投票已于周三(2011年8月10号)结束,所有国家都投出了赞成票,C+0x已经毫无疑义地成为正式国际标准。虽然接下来还需要数月时间出版发布,但标准本身已经完全正式成立了。组成部分根据Effective C+第三版第一

4、条款的描述,现在C+由以下四个“子语言”组成:1、C子语言。C+支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C+标准文献)。2、面向对象的C+语言。C+语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C+语言也开发出了支持面向对象功能的版本.3、泛型编程语言。C+强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。4、STL(C+标准模板库,Standard Template Library)。随着STL的不断发展,它已经逐渐成为C+程序设计中不可

5、或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。此外,包含在TR1等中的C+0x将实现的新功能在开发和测试中。语言发展C+语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。这一阶段C+语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C+中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C+受到了一定的冲击;第三阶段从2000年至今,由

6、于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C+出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C+已经成为当今主流程序设计语言中最复杂的一员。入门书籍C+是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程,所以在开始学习的时候,必须先要打好基础。在市面上有很多Visual C+的书,虽然其中可能会花1-2章来介绍C+的基本特性,但是那绝对不会让你入门。因此,初学者学习C+应该选择针对C+语言本身的书籍,而不能是针对Visual C+、MFC或者Windows API的。学习C+应该由易至难,循序渐进。以前经常有人说学习C+之前应

7、该学习C语言。事实上那不是必须的,C+和C语言虽然有关系,但仍然是两种不同的语言。当然,在学习C+之前学习过其他编程语言是很有好处的。那会使学习C+的速度更快,毕竟很多计算机语言的概念都是相通的。而对于零基础的初学者来说,则是应该静下心来,不要急躁。要成为C+的高手,不是那么容易的,必须要花很大的努力。从入门教材的选择上,主要看学习者的自身情况。如果已经有过学习高级语言的经历,那么推荐使用谭浩强的C+程序设计。注意是04年版的,06年版的那本书是阉割版,上来就面向对象。虽然说C和C+是相似的,但是前面已经说了,C和C+应该作为两种语言来学习,所以06年的那本内容就稍微欠缺一点了。谭浩强04版的

8、这本书内容比较规整的,条理也很清晰。如果有过其他高级语言的基础,那么估计半年就能对C+的概况有个了解了。谭浩强老师的书已经成为了全国各大高等院校的教科书,是比较受到认可的。如果是从零基础开始学C+,那么推荐使用潘嘉杰的易学C+。这本书是2008年出的新书,听说是个学生在读书的时候写的。这本书网上有下载免费的电子版。这本书主要就是针对初学者的,讲得也比较生动有趣,比较提得起学习的兴趣。所以没有基础的初学者选这本书也是不错的,就是想要很快成为高手,可能看这本书还不够。至于看完入门的书之后,就应该看一些高层次的书了。比如和,同时也可以向STL、MFC、API等各个方向发展。如果对别的语言感兴趣,还能

9、去看看C#和Java,它们和C+从语法和很多概念上都是类似的。设计原则 C+设计成静态类型、和C同样高效且可移植的多用途程序设计语言。 C+设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。 C+设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。 C+设计成尽可能与C兼容,籍此提供一个从C到C+的平滑过渡。 C+避免平台限定或没有普遍用途的特性。 C+不使用会带来额外开销的特性。 C+设计成无需复杂的程序设计环境。出于保证语言的简洁和运行高效等方面的考虑,C+的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言

10、本身里。关于此类话题,C+之父的C+语言的设计和演化 里做了详尽的陈述。Hello World程序在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:(事实上这并不是符合98标准ISO C+的C+程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将stdio.h改为iostream.h)#include int main()printf(Hello, world!n);return 0;(以上是c语言代码,c+语言是c语言高一级的版本)在使用兼容C+98标准(ISO/IEC 14882-1998)的编译

11、器时,下面的程序也是可以的:#include int main()cout Hello, world! endl;return 0;在使用兼容C+ STL的编译器时,应当是:#include using namespace std;int main()coutHello,world!endl;return 0;根据ISO C+的规定,main函数的形式只能是int main(void).以及int main(int argc,char * argv).尽管如此,但在Visual C+ 2003以前的Microsoft Visual Studio编译器上,void main().也被支持,但这并

12、不正确,也不标准。这样的写法会使程序代码丧失跨平台的特性。每年都有专业人士规定C+的语法,这也是C+优于其他编程语言的原因之一,由它衍生的Java已成为通用编程语言中广受欢迎的一种。代码性能一般认为,使用Java或C#的开发成本比C+低。但是,如果你能够充分分析C+和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C+的优势将会越来越明显。造成这种差别的就是C+的软件工程性。在Java和C#大谈软件工程的时候,C+实际上已经悄悄地将软件工程性提升到一个

13、前所未有的高度。这一点被多数人忽视,并且被大公司竭力掩盖。语言在软件工程上的好坏,依赖于语言的抽象能力。从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。但在实践中,人们发现面向对象无法解决所有软件工程中的问题。于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。应用实例哪些程序是用C+写的:主流的3种操作系统Windows内核都是用C语言和汇编写的,上层高级特性是用C+写的。魔兽世界等几乎所有的网络游戏,百度搜索引擎,我们所用的大多数软件都是用C+写的(硬件也有很多

14、用到C+的)。以下是一些C+的应用:Amazon:Software for large-scale e-commerceApple: OS X is written in a mix of language, but a few important parts are C+(当然最核心的部分都是汇编与c语言).AT&T:The largest US telecommunications provider.o provisioning systemso systems for rapid network recovery after failureAutodesk: A large number

15、 of major number of application in the CAD domainEricsson:o server platform.o TDMA-CDMA HLRo GSM-TDMA-CDMA mobility gatewayGoogle: web search engine, etc。HP: Here is a tiny fraction of HPs C+ apps:o C, C+, Fortran90 compilers, and linker for the new HP IA64 platform (these add to more than 1 million

16、 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 softwareo compilers and optimizerso lots of chip design and manufacturing softwareJPL(Jet Propulsion Lab,NASA): Mars ro

17、ver 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 XPo Windows NT (NT4 and 2000)o Windows 9x (95, 98, Me)o Microsoft Office (Word, Excel, Access, PowerPoint, Outlook)o Internet Explorer

18、(including Outlook Express)o Visual Studioo SQLMozilla: Firefox browser and Thunderbird mail client (open source)MySQL: MySQL Server (about 250,000 lines of C+) and MySQL Cluster. Arguably the worlds most popular open source databaseNokia:o Mobile Communications radio-station/internet bridges: Flexi

19、GGSN (Gateway GPRS Support Node) and FlexiSGSN (Server GPRS Support Node).o MSC/HLRSun: 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 OSs for cellular phonesKDEfrom linux is writte

20、n in C+.telephone systems: I think it would be almost easier to list the systems which arent written in C+C+写出的软件,还包括VLC, 著名的开源视频播放器;LAMMPS,著名分子动力学模拟软件,其中包括一部分Fortran代码;编程技巧使用new和delete进行动态内存分配和释放运算符new和delete是C+新增的运算符,提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new较之使用malloc()有以下的几个优点:(

21、1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。(2)自动地返回正确的指针类型,不用进行强制指针类型转换。(3)可以用new对分配的对象进行初始化。使用例子:(1)int* p;p=new int10; /分配一个含有10个整数的整型数组delete p; /释放这个指向数组的指针所占内存(2)int* p;p=new int (100);/动态分配一个整数并初始化使用inline内联函数替代宏调用对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs

22、(a)(a)0?(-a):(a),当使用abs(i+)时,这个宏就会出错。所以在C+中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。使用内联函数只须把inline关键字放在函数返回类型的前面。例如:inline int Add(int a,int b);/声明Add()为内联函数这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。使用函数重载在C语言中,两个函数的名称不能相同,否则会导致编译错误。而在C+中,函数名相同而参数数据类型不同的两个函数被解释为重载。例如:void PutHz(char* str);/在

23、当前位置输出汉字void PutHz(int x,?int y,?char * str);/在x,y处输入数字使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。用引用(reference)代替指针进行参数传递在C语言中,如果一个函数需要修改用作参数的变量值的时候 ,参数应该声明为指针类型。例如:void Add(int *a)(*a)+;调用时则使用Add(&x); /其中x为in

24、t或可以转化为int的类型,如unsigned int, 但这时候编译器通常会给出warning对于复杂的程序,使用指针容易出错,程序也难以读懂。在C+中,对于上述情况 可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。例如使用引用的函数定义为:void Add(int& a)a+;/a为一个整数的引用调用时使用Add(x);/其中x为int这个函数与使用指针的上一个函数的功能是一样的,然而代码却更为简洁和清晰易懂。使用缺省参数在C+中函数可以使用缺省参数,例如:void PutHzxy(char *str,int x=-1,

25、 int y=-1)if(x=-1)x=wherex();if(y=-1)x=wherex();moveto(x,y);PutHx(str);可以有三种方式调用函数PutHzxy(),例如:PutHzxy(C+语言);/使用缺省参数,在当前位置输出PutHzxy(C+语言,10,10);/没有使用缺省参数PutHzxy(C+语言,10);/对y使用缺省参数,指定x的位置通常的情况下,一个函数应该具有尽可能大的灵活性。使用缺省参数为程序员处理更大的复杂性和灵活性问题提供了有效的方法,所以在C+的代码中都大量地使用了缺省参数。需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。亦即,一旦开始定

26、义缺省参数,就不可再说明非缺省的参数。否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。例如:void PutHzxy(char*str,int x=-1,int y=-1)/正确void PutHzxy(int x=-1,int y=-1,char*str)/错误使用STLSTL(Standard Template Library,标准模板库), STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。几乎所有的代码都采用了模板类和模版函数的

27、方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。#include/ 包含相关的头文件/typedef std:vector intvector;/使用typedef 使代码看起来更简洁int main()intvector vi;for(int i=0;i10,i+)vi.push_back(i);/使用push_back添加元素for(int i=0;ivi.size();i+)std:coutvii ;/操作符被重载,使得我们可以像访问数组一样访问vector中的元素开发方式在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。一般是如下组合:1.编译器:gc

28、c,clang等2.编辑器:一般是vim/emacs3.make:gnu make 或者bsd 的pmake等,功能与用法基本一样4.版本管理:cvs,svn,git等5.代码阅读:cscope,ctags,lxr等开发环境1.Visual Studio(Visual C+)2.BorlandC+ Builder3.Eclipse(Myln + CDT + Mingw32 + GCC)4.Dev-C+(Mingw32 + GCC)5.Code:Blocks(可配合多款编译核心使用)6.Codelite7.C-Free如上所示,目前流行的GNU GCC和微软的Visual Studio系列各执一

29、套基本的编译链,其他的IDE都是衍生产品经典著作The C+ Standard Library: A Tutorial and Reference中文版:C+标准程序库:自修教程与参考手册百科全书式的C+标准库著作,一本需要一再查阅的参考大全。本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。 浅显易懂的写作风格使得这本书非常易读。Standard C+ IOStreams and Locales: Advanced Programmers Guide and Reference中

30、文版标准C+输入输出流与本地化Effective STL使用STL的程序员必读之作。在这本书中,Scott讲述了STL容器和算法的工作机制以及如何以最佳方式使用它们。和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。影印版Generic Programming and the STL: Using and Extending the C+ Standard Template Library中文版泛型编程与STL这本书散发着浓厚的学院气息。Andrew Koenig和Barbara Moo在Accelerated C+: Practical Programming by

31、Example一书末尾郑重推荐另外两本进阶好书(除了他们自己的Ruminations on C+外),其中一本是TCPL,另外一本就是本书。Douglas C. Schmidt, Stephen D. Huston,C+ Network ProgrammingVolume 1: Mastering Complexity with ACE and Patterns;Volume 2: Systematic Reuse with ACE and Frameworks;中文版:,C+网络编程卷1:运用ACE和模式消除复杂性卷2:基于 ACE 和框架的系统化复用采用C+进行企业级网络编程,ACE(Ad

32、aptive Communications Environment)是一个值得考虑的选择,ACE是一个面向对象、跨平台、开放源码的网络编程框架,目标在于构建高性能网络应用和中间件。Douglas是ACE的创始人,Stephen则已为ACE提供了数年的技术支持和顾问服务,两位都是ACE社群(是的,ACE的影响和实际应用的程度已经形成了一个社群)的专家。除了使用C+面向对象设计技术和模板等高级语言特性外,ACE还运用了大量的模式。C+网络编程卷1和卷2并不仅仅教你关于ACE的方方面面,它还会教给你模式和通用框架设计等高级技术等。并非所有网络应用都要使用Web服务器(以及其他应用服务器)和重量级组件

33、模型,换个思路,它们或许也可以从轻量级的ACE组件中获益。Bruce Eckel,Thinking in C+影印版二版、三版(又名卷二)中文C+编程思想二版卷一:标准C+导引卷二:实用编程技术Thinking in C+的第1版于1996年荣获“软件研发”杂志评选的图书震撼大奖。第2版对内容进行了大幅改写和调整,以反映C+标准化带来的影响以及当时面向对象领域最新研究和实践成果。“输入输入流”、“多重继承”、“异常处理”和“运行时类型识别”等高级主题连同C+标准化以后增加的一些内容则被放入第二卷中。事实上,在同类图书中,对于大多数读者而言,这本书的可读性要超过TCPL和C+ Primer。顺带

34、一提,访问作者的站点,你可以先睹第二卷的风采。Andrew Koenig, Barbara E. Moo,Ruminations on C+: A Decade of Programming Insight and Experience中文版C+沉思录一本关于C+编程思想和程序设计技术而非语言细节的著作。Bjarne这样评价这本书:本书遍布“C+是什么?C+能够做什么?”的真知灼见。Stanley B. Lippman,影印版Inside The C+ Object Model中文版深度探索C+对象模型从编译器的角度观察C+。本书探讨了大量的C+面向对象程序设计的底层运作机制,包括构造函数、函

35、数、临时对象、继承、虚拟、模板的实例化、异常处理、运行期类型识别等,另外还介绍了一些在实现C+对象模型过程中做出的权衡折衷。Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,Design Patterns:Elements of Reusable Object-Oriented software中文版设计模式:可复用面向对象软件的基础本书并非专为C+程序员而写,但它采用了C+(以及Smalltalk)作为主要示例语言,C+程序员尤其易于从中受益。John Lakos,Large-Scale C+ Software Design中文

36、版大规模C+程序设计候捷:STL 源码剖析STL 源码剖析是一本很有特色的书。遗憾的是,侯捷先生在完成C+ Templates: The Complete Guide一书的翻译后似乎决定暂时告别模板、泛型编程和STL领域。The C+ Standard : Incorporating Technical Corrigendum No. 1C+面向对象程序设计(作者:Walter Savitch) 这本书是老外出的书,从基础到深入,很容从C过渡到C+C+ Primer中文版(第4版)(一本久负盛名的C+经典教程)常见错误Ambiguous operators need parentheses -

37、不明确的运算需要用括号括起Ambiguous symbol xxx -不明确的符号Argument list syntax error -参数表语法错误Array bounds missing -丢失数组界限符Array size toolarge -数组尺寸太大Bad character in paramenters -参数中有不适当的字符Bad file name format in include directive -包含命令中文件名格式不正确Bad ifdef directive synatax -编译预处理ifdef有语法错Bad undef directive syntax -编

38、译预处理undef有语法错Bit field too large -位字段太长Call of non-function -调用未定义的函数Call to function with no prototype -调用函数时没有函数的说明Cannot modify a const object -不允许修改常量对象Case outside of switch -漏掉了case 语句Case syntax error - Case 语法错误Code has no effect -代码不可述不可能执行到Compound statement missing -分程序漏掉Conflicting type

39、modifiers -不明确的类型说明符Constant expression required -要求常量表达式Constant out of range in comparison -在比较中常量超出范围Conversion may lose significant digits -转换时会丢失意义的数字Conversion of near pointer not allowed -不允许转换近指针Could not find file xxx -找不到XXX文件Declaration missing ; -说明缺少;Declaration syntax error -说明中出现语法错误D

40、efault outside of switch - Default 出现在switch语句之外Define directive needs an identifier -定义编译预处理需要标识符Division by zero -用零作除数Do statement must have while - Do-while语句中缺少while部分Enum syntax error -枚举类型语法错误Enumeration constant syntax error -枚举常数语法错误Error directive :xxx -错误的编译预处理命令Error writing output file

41、-写输出文件错误Expression syntax error -表达式语法错误Extra parameter in call -调用时出现多余错误File name too long -文件名太长Function call missing -函数调用缺少右括号Fuction definition out of place -函数定义位置错误Fuction should return a value -函数必需返回一个值Goto statement missing label - Goto语句没有标号Hexadecimal or octal constant too large -16进制或8进制常数太大Illegal character x -非法字符xIllegal initialization -非法的初始化Illegal octal digit -非法的8进制数字Illegal pointer subtraction -非法的指针相减Illegal structure operation -非法的结构体操作Illegal use of floating point -非法的浮点运算Illegal use of pointer -指针使用非法Improper use of a typedefsym

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1