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

上传人:b****5 文档编号:8271464 上传时间:2023-01-30 格式:DOCX 页数:18 大小:36.73KB
下载 相关 举报
C++概论C语言过度版.docx_第1页
第1页 / 共18页
C++概论C语言过度版.docx_第2页
第2页 / 共18页
C++概论C语言过度版.docx_第3页
第3页 / 共18页
C++概论C语言过度版.docx_第4页
第4页 / 共18页
C++概论C语言过度版.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

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

《C++概论C语言过度版.docx》由会员分享,可在线阅读,更多相关《C++概论C语言过度版.docx(18页珍藏版)》请在冰豆网上搜索。

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

C++概论C语言过度版

历史简介  

  C语言之所以要起名为“C”,是取的“BCPL”的第二个字母(第一个字母用来命名之前被发明的B语言)。

当C语言发展到顶峰的时刻,出现了一个版本叫CwithClass,那就是C++最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的++运算符来体现它是C语言的进步,故而叫C++,成立了C++标准委员会。

  美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(BjarneStroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“CwithClasses”)。

一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。

虚函数(virtualfunction)、运算符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常(exception)、RTTI、命名空间(namespace)逐渐被加入标准。

1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC1988-1998。

C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。

1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新原定是在2009年,目前我们一般称该标准C++0x,但是由于对于新特性的争端激烈,除了在TechnicalReport1(tr1)中的新增修改被基本确定外,完整的标准还遥遥无期。

况且遗憾的是,由于C++语言过于复杂,以及经历了长年的演变,直到现在(2010年)都没有有一个编译器完全符合这个标准。

  据HerbSutter报告,C++0x最终国际投票已于周三(2011年8月10号)结束,所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。

虽然接下来还需要数月时间出版发布,但标准本身已经完全正式成立了。

组成部分  根据EffectiveC++第三版第一条款的描述,现在C++由以下四个“子语言”组成:

  1、C子语言。

C++支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。

  2、面向对象的C++语言。

C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本.

  3、泛型编程语言。

C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。

  4、STL(C++标准模板库,StandardTemplateLibrary)。

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

  此外,包含在TR1等中的C++0x将实现的新功能在开发和测试中。

语言发展

  C++语言发展大概可以分为三个阶段:

  第一阶段从80年代到1995年。

这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;

  第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。

当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

  第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

入门书籍

  C++是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程,所以在开始学习的时候,必须先要打好基础。

在市面上有很多VisualC++的书,虽然其中可能会花1-2章来介绍C++的基本特性,但是那绝对不会让你入门。

因此,初学者学习C++应该选择针对C++语言本身的书籍,而不能是针对VisualC++、MFC或者WindowsAPI的。

  学习C++应该由易至难,循序渐进。

以前经常有人说学习C++之前应该学习C语言。

事实上那不是必须的,C++和C语言虽然有关系,但仍然是两种不同的语言。

当然,在学习C++之前学习过其他编程语言是很有好处的。

那会使学习C++的速度更快,毕竟很多计算机语言的概念都是相通的。

而对于零基础的初学者来说,则是应该静下心来,不要急躁。

要成为C++的高手,不是那么容易的,必须要花很大的努力。

  从入门教材的选择上,主要看学习者的自身情况。

如果已经有过学习高级语言的经历,那么推荐使用谭浩强的《C++程序设计》。

注意是04年版的,06年版的那本书是阉割版,上来就面向对象。

虽然说C和C++是相似的,但是前面已经说了,C和C++应该作为两种语言来学习,所以06年的那本内容就稍微欠缺一点了。

谭浩强04版的这本书内容比较规整的,条理也很清晰。

如果有过其他高级语言的基础,那么估计半年就能对C++的概况有个了解了。

谭浩强老师的书已经成为了全国各大高等院校的教科书,是比较受到认可的。

  如果是从零基础开始学C++,那么推荐使用潘嘉杰的《易学C++》。

这本书是2008年出的新书,听说是个学生在读书的时候写的。

这本书网上有下载免费的电子版。

这本书主要就是针对初学者的,讲得也比较生动有趣,比较提得起学习的兴趣。

所以没有基础的初学者选这本书也是不错的,就是想要很快成为高手,可能看这本书还不够。

  至于看完入门的书之后,就应该看一些高层次的书了。

比如<>和<>,同时也可以向STL、MFC、API等各个方向发展。

如果对别的语言感兴趣,还能去看看C#和Java,它们和C++从语法和很多概念上都是类似的。

设计原则

  ·C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。

  ·C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。

  ·C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。

  ·C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。

  ·C++避免平台限定或没有普遍用途的特性。

  ·C++不使用会带来额外开销的特性。

  ·C++设计成无需复杂的程序设计环境。

  出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。

关于此类话题,C++之父的《C++语言的设计和演化》里做了详尽的陈述。

  

HelloWorld程序

在使用兼容C89标准(也称为ANSIC)的编译器时,下面这个程序显示“Hello,world!

”然后结束运行:

 

(事实上这并不是符合98标准[ISOC++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将stdio.h改为iostream.h) 

#include 

intmain() 

printf("Hello,world!

\n"); 

return0; 

(以上是c语言代码,c++语言是c语言高一级的版本)

在使用兼容C++98标准(ISO/IEC14882-1998)的编译器时,下面的程序也是可以的:

 

#include 

intmain() 

cout<<"Hello,world!

"<

return0; 

}

在使用兼容C++STL的编译器时,应当是:

 

#include 

usingnamespacestd; 

intmain() 

cout<<"Hello,world!

"<

return0; 

根据ISOC++的规定,main函数的形式只能是 

intmain(void) 

... 

以及 

intmain(intargc,char*argv[]) 

... 

尽管如此,但在VisualC++2003以前的MicrosoftVisualStudio编译器上, 

voidmain() 

... 

也被支持,但这并不正确,也不标准。

这样的写法会使程序代码丧失跨平台的特性。

每年都有专业人士规定C++的语法,这也是C++优于其他编程语言的原因之一,由它衍生的Java已成为通用编程语言中广受欢迎的一种。

代码性能

  一般认为,使用Java或C#的开发成本比C++低。

但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。

这个条件就是:

软件规模和复杂度都比较小。

如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。

否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。

造成这种差别的就是C++的软件工程性。

在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。

这一点被多数人忽视,并且被大公司竭力掩盖。

  语言在软件工程上的好坏,依赖于语言的抽象能力。

从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。

但在实践中,人们发现面向对象无法解决所有软件工程中的问题。

于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。

(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。

应用实例

  哪些程序是用C++写的:

  主流的3种操作系统Windows内核都是用C语言和汇编写的,上层高级特性是用C++写的。

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

  以下是一些C++的应用:

  Amazon:

Softwareforlarge-scalee-commerce

  Apple:

OSXiswritteninamixoflanguage,butafewimportantpartsareC++(当然最核心的部分都是汇编与c语言).

  AT&T:

ThelargestUStelecommunicationsprovider.

  oprovisioningsystems

  osystemsforrapidnetworkrecoveryafterfailure

  Autodesk:

AlargenumberofmajornumberofapplicationintheCADdomain

  Ericsson:

  oserverplatform.

  oTDMA-CDMAHLR

  oGSM-TDMA-CDMAmobilitygateway

  Google:

websearchengine,etc。

  HP:

HereisatinyfractionofHP'sC++apps:

  oC,C++,Fortran90compilers,andlinkerforthenewHPIA64platform(theseaddtomorethan1millionlinesofC++code).

  IBM:

  oOS/400.

  oK42:

ahighperformance,opensource,general-purposeoperatingsystemkernelforcache-coherentmultiprocessors.

  Intel:

  oVtuneperformaceanalysissoftware

  ocompilersandoptimizers

  olotsofchipdesignandmanufacturingsoftware

  JPL (JetPropulsionLab, NASA):

Marsroverautonomousdrivingsystem(incl.sceneanalysisandrouteplanning).C++onMars!

Alsolotsofsupportingsoftware"ontheground"(i.e.Earth).

  Microsoft:

  oWindowsXP

  oWindowsNT(NT4and2000)

  oWindows9x(95,98,Me)

  oMicrosoftOffice(Word,Excel,Access,PowerPoint,Outlook)

  oInternetExplorer(includingOutlookExpress)

  oVisualStudio

  oSQL

  Mozilla:

FirefoxbrowserandThunderbirdmailclient(opensource)

  MySQL:

MySQLServer(about250,000linesofC++)andMySQLCluster.Arguablytheworld'smostpopularopensourcedatabase

  Nokia:

  oMobileCommunicationsradio-station/internetbridges:

FlexiGGSN(GatewayGPRSSupportNode)andFlexiSGSN(ServerGPRSSupportNode).

  oMSC/HLR

  Sun:

oTheHotSpotJavaVirtualMachineiswritteninC++

  SymbianOS:

rationale:

"[...]usingC++forallsystemcode,fromthekernelupwards."ThisisoneofthemostwidespreadOS'sforcellularphones

  KDE fromlinuxiswritteninC++.

  telephonesystems:

Ithinkitwouldbealmosteasiertolistthesystemswhicharen'twritteninC++

  C++写出的软件,还包括

  VLC,著名的开源视频播放器;

  LAMMPS,著名分子动力学模拟软件,其中包括一部分Fortran代码;

编程技巧

使用new和delete进行动态内存分配和释放

  

  运算符new和delete是C++新增的运算符,提供了存储的动态分配和释放功能。

它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。

使用new较之使用malloc()有以下的几个优点:

  

(1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。

  

(2)自动地返回正确的指针类型,不用进行强制指针类型转换。

  (3)可以用new对分配的对象进行初始化。

  使用例子:

  

(1)int*p;

  p=newint[10];//分配一个含有10个整数的整型数组

  delete[]p;//释放这个指向数组的指针所占内存

  

(2)int*p;

  p=newint(100);//动态分配一个整数并初始化

使用inline内联函数替代宏调用

  对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。

但是宏调用有许多的弊端,可能引起不期望的副作用。

例如宏:

#defineabs(a)(a)<0?

(-a):

(a)),当使用abs(i++)时,这个宏就会出错。

  所以在C++中应该使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。

  使用内联函数只须把inline关键字放在函数返回类型的前面。

例如:

  inlineintAdd(inta,intb);//声明Add()为内联函数

  这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。

使用函数重载

  在C语言中,两个函数的名称不能相同,否则会导致编译错误。

而在C++中,函数名相同而参数数据类型不同的两个函数被解释为重载。

例如:

  voidPutHz(char*str);//在当前位置输出汉字

  voidPutHz(intx,?

inty,?

char*str);//在x,y处输入数字

  使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。

同时必须注意,参数数据类型相同,但是函数返回类型不同的两个函数不能重载。

用引用(reference)代替指针进行参数传递

  在C语言中,如果一个函数需要修改用作参数的变量值的时候,参数应该声明为指针类型。

例如:

  voidAdd(int*a)

  {

  (*a)++;

  }

  调用时则使用

  Add(&x);//其中x为int或可以转化为int的类型,如unsignedint,但这时候编译器通常会给出warning

  对于复杂的程序,使用指针容易出错,程序也难以读懂。

在C++中,对于上述情况可以使用引用来代替指针,使程序更加清晰易懂。

引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。

例如使用引用的函数定义为:

  voidAdd(int&a)

  {

  a++; //a为一个整数的引用

  }

  调用时使用

  Add(x); //其中x为int

  这个函数与使用指针的上一个函数的功能是一样的,然而代码却更为简洁和清晰易懂。

使用缺省参数

  在C++中函数可以使用缺省参数,例如:

  voidPutHzxy(char*str,intx=-1,inty=-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++的代码中都大量地使用了缺省参数。

  需要说明的是,所有的缺省参数必须出现在不缺省参数的右边。

亦即,一旦开始定义缺省参数,就不可再说明非缺省的参数。

否则当你省略其中一个参数的时候,编译器无法知道你是自定义了这个参数还是利用了缺省参数而定义了非缺省的参数。

  例如:

 

  voidPutHzxy(char*str,intx=-1,inty=-1)//正确

  voidPutHzxy(intx=-1,inty=-1,char*str)//错误

使用STL

  STL(StandardTemplateLibrary,标准模板库),STL的代码从广义上讲分为三类:

algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。

几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

  #include//包含相关的头文件/

  typedefstd:

:

vectorintvector;//使用typedef使代码看起来更简洁

  intmain()

  {

  intvectorvi;

  for(inti=0;i<10,i++)

  vi.push_back(i);//使用push_back添加元素

  for(inti=0;i

  std:

:

cout<

  }

开发方式

  在unix世界有大量的程序员是传统的非IDE的方式进行软件开发。

一般是如下组合:

  1.编译器:

gcc,clang等

  2.编辑器:

一般是vim/emacs

  3.make:

gnumake或者bsd的pmake等,功能与用法基本一样

  4.版本管理:

cvs,svn,git等

  5.代码阅读:

cscope,ctags,lxr等

开发环境

  1.VisualStudio(VisualC++) 

  2.Borland C++Builder

  3.Eclipse(Myln+CDT+Mingw32+GCC)

  4.Dev-C++(Mingw32+GCC)

  5.Code:

:

Blocks(可配合多款编译核心使用)

  6.Codelite

  7.C-Free 

  如上所示,目前流行的GNUGCC和微软的VisualStudio系列各执一套基本的编译链,其他的IDE都是衍生产品

  

经典著作

  ●《TheC++StandardLibrary:

ATutorialandReference》

  中文版:

《C++标准程序库:

自修教程与参考手册》

  百科全书式的C++标准库著作,一本需要一再查阅的参考大全。

本书详细介绍了每一标准库组件的规格和用法,内容涵盖包括流和本地化在内的整个标准库而不仅仅是STL。

正如本书副标题所示,它首先适合作为教程阅读,尔后又可用作参考手册。

浅显易懂的写作风格使得这本书非常易读。

  ●《StandardC++IOStreamsandLocales:

AdvancedProgrammer'sGuideandReference》

  中文版《标准C++输入输出流与本地化》

  ●《EffectiveSTL》

  使用STL的程序员必读之作。

在这本书中,Scott讲述了STL容器和算法的工作机制以及如何以最佳方式使用它们。

和Scott的其他作品一样,这本书的写作风格清晰、精确,具有极佳的可读性。

  ●影印版《GenericPro

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1