现在的位置: 首页 > 综合 > 正文

C++深入体验之旅一:C++概述

2013年01月27日 ⁄ 综合 ⁄ 共 9643字 ⁄ 字号 评论关闭

1.C++的发展过程和历史

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

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

  2. 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

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

以下是C++发展年代列表:

  1. 1967 年,Simula 语言中第一次出现了面向对象 (OO) 的概念,但由于当时软件规模还不大,技术也还不太成熟,面向对象的优势并未发挥出来。

  2. 1980 年,Smalltalk-80 出现后,面向对象技术才开始发挥魅力。

  3. 1979 年,Bjarne Stroustrup 借鉴 Simula 中 "Class" 的概念,开始研究增强 C 语言,使其支持面向对象的特性。 B.Stroustrup 写了一个转换程序 "Cfront" 把 C++ 代码转换为普通的 C 代码,使它在各种各样的平台上立即投入使用。 1983 年,这种语言被命名为 C++

  4. 1986 年,B.Stroustrup 出版了 《The C++ Programming Language》第一版,这时 C++ 已经开始受到关注, B.Stroustrup 被称为 C++之父(Creator of C++)。

  5. 1989 年,负责 C++ 标准化的 ANSI X3J16挂牌成立。1990 年,B.Stroustrup 出版了 《The Annotated C++ Reference Manual》(简称 ARM),由于当时还没有 C++ 标准,ARM 成了事实上的标准。

  6. 1990 年, Template(模板) 和 Exception(异常) 加入到了 C++ 中, 使 C++ 具备了泛型编程(Generic Programming)和更好的运行期错误处理方式。

  7. 1991 年,负责 C++ 语言国际标准化的技术委员会工作组 ISO/IEC JTC1/SC22/WG21 召开了第一次会议,开始进行 C++ 国际标准化的工作。从此,ANSI 和 ISO 的标准化工作保持同步,互相协调。

  8. 1993 年,RTTI(运行期类型识别) 和 Namespace(名字空间) 加入到 C++ 中。1994 年, C++ 标准草案出台。 B.Stroustrup 出版了《The Design and Evolution of C++》(简称 D&E)。

    本来,C++ 标准已接近完工,这时 STL(标准模板库) 的建议草案被提交到标准委员会,对 STL 标准化的讨论又一次推迟了 C++ 标准的出台。

  9. 1998 年,ANSI 和 ISO 终于先后批准 C++ 语言成为美国国家标准和国际标准。

  10. 2000 年,B.Stroustrup 推出了 《The C++ Programming Language》特别版(Special Edition),书中内容根据 C++ 标准进行了更新。

语言的发展是一个逐步递进的过程,C++ 是直接从 C 语言发展过来的,而 C 语言是从 B 语言发展过来的,B 语言是 BCPL 的一个解释性后代,BCPL 是 Basic CPL。其中最有趣的是 CPL 中 C 的由来,由于当时这个语言是剑桥大学和伦敦大学合作开发的,在伦敦的人员加入之前,C 表示剑桥,伦敦人员加入之后,C 表示 Combined 组合。还有一种非正式的说法,C 表示 Christopher,因为 Christopher 是 CPL 背后的主要动力。

最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。

当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。

2.C++发展中的杰出人物

Dennis M. Ritchie被称为C语言之父,UNIX之父,生于1941年9月9日,哈佛大学数学博士,现任朗讯科技公司贝尔实验室(原AT&T实验室)下属的计算机科学研究中心系统软件研究部的主任一职。他开发了C语言,并著有《C程序设计语言》(The C Programming Language)一书,还和Ken Thompson一起开发了UNIX操作系统。他因杰出的工作得到了众多计算机组织的公认和表彰,1983年,获得美国计算机协会颁发的图灵奖(又称计算机界的诺贝尔奖),还获得过C&C基金奖、电气和电子工程师协会优秀奖章、美国国家技术奖章等多项大奖。

Bjarne Stroustrup 1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和英国剑桥大学,AT&T大规模程序设计研究部门负责人,AT&T贝尔实验室和ACM成员。1979年,Stroustrup开始开发一种语言,当时称为“C with Class”,后来演化为C++。1998年,ANSI/ISO C++标准建立,同年,Stroustrup推出其经典著作The C++ Programming Language的第三版。

Scott Meyers是世界顶级的C++软件开发技术权威之一,他拥有Brown University的计算机科学博士学位,其著作Effective C++和More Effective C++很受编程人员的喜爱。Scott Meyers曾经是《C++ Report》的专栏作家,为《C/C++ Users Journal》和《Dr. Dobb’s Journal》撰过稿,为全球范围内的客户提供咨询活动。他还是Advisory Boards for NumeriX LLC和InfoCruiser公司的成员。

Andrei Alexandrescu被认为是新一代C++天才的代表人物,2001年撰写了经典名著Modern C++ Design,其中对Template技术进行了精湛运用,第一次将模板作为参数在模板编程中使用,该书震撼了整个C++社群,开辟了C++编程领域的“Modern C++”新时代。此外,他还与Herb Sutter合著了C++ Coding Standards。他在对象拷贝(objectcopying)、对齐约束(alignment constraint)、多线程编程、异常安全和搜索等领域作出了巨大贡献。


Herb Sutter是C++ Standard Committee的主席,作为ISO/ANSI C++标准委员会的委员,Herb Sutter是C++程序设计领域屈指可数的大师之一。他的Exceptional系列三本书(Exceptional C++、More Exceptional C++和Exceptional C++ Style)成为C++程序员必读书。他是深受程序员喜爱的技术讲师和作家,是《C/C++ Users Journal》的撰稿编辑和专栏作者,曾发表了上百篇软件开发方面的技术文章和论文。他还担任Microsoft
Visual C++架构师,和Stan Lippman一道在微软主持VC 2005(即C++/CLI)的设计。

Andrew Koenig是AT&T公司Shannon实验室大规模编程研究部门中的成员,同时也是C++标准委员会的项目编辑,是一位真正的C++内部权威。Andrew Koenig的编程经验超过30年,其中有15年在使用C++,已经出版了超过150篇和C++有关的论文,并且在世界范围内就这个主题进行过多次演讲,对C++

3.C++特点概述

C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。

C++语言具有以下特点:

  1. C++是C语言的超集。它既保持了C语言的简洁、高效和接近汇编语言等特点,又克服了C语言的缺点,其编译系统能检查更多的语法错误,因此,C++比C语言更安全。

  2. C++保持了与C语言的兼容。绝大多数C语言程序可以不经修改直接在C++环境中运行,用C语言编写的众多库函数可以用于C++程序中。

  3. 支持面向对象程序设计的特征。C++既支持面向过程的程序设计,又支持面向对象的程序设计。

  4. C++程序在可重用性、可扩充性、可维护性和可靠性等方面都较C语言得到了提高,使其更适合开发大中型的系统软件和应用程序。

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

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

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

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

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

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

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

出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,Bjarne Stroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。

4.C++程序设计要做什么

很多初学者会不解:程序设计到底是要做什么呢?我们该如何教会电脑解决问题呢?

其实,要解决一些看似不同的问题,我们可以将其归结为一种确定的过程和方法。我们把这种能够解决一类问题的过程和方法称为算法(Algorithm)。

下面,我们以解一元二次方程为例,介绍求解的算法:

  1. 输入二次项系数a,一次项系数b和常数项c。

  2. 计算△=b2-4ac。

  3. 判断△的大小,如果△≥0,则有实数解,否则就没有实数解。

  4. 如果有实数解,就利用求根公式求出两个解。

  5. 输出方程的两个实数解,或告知无解。

      以上便是用自然语言描述的求解一元二次方程的算法。程序设计所要做的便是探求这种能解决一类问题的算法,并且要将这种算法用计算机能够“看懂”的语言表达出来。

      5.Visual C++能做什么

        C++能够制作多种Windows下的软件。事实上,Windows下的应用软件也有很大部分是用C++开发的。比如:

        1. 设计控制台应用程序可以编出计算量较大的,用于科学计算的小程序;

        2. 用MFC类库可以设计中小型企业的内部管理程序;

        3. 用一些图形的API可以编出大型的3D游戏,或者游戏机模拟器;

        4. 利用C++能够接触系统底层的特点,可以编出优化软件让内存运作的性能大大提高;

        5. 利用C++可以与内存打交道的特点,可以编出游戏修改器;

        6. 甚至用C++可以编出手机游戏来。

            总而言之,C++的功能是非常强大的。

            由于C++是面向对象的高级语言,所以用它来开发软件可以大大减少重复的工作,使得设计程序更为轻松。

            为了降低学习的难度,本书主要介绍如何设计控制台应用程序。控制台应用程序是C++程序设计的基础。它涵盖了C++程序设计的大部分知识。而更大型的软件设计与之也是触类旁通的。所以,学好如何设计控制台应用程序,便是为将来打下了扎实的基础。

          6.学习程序设计的方法和准备

          学习方法——四“多”一“有”

          1、多看:多看别人写的程序,从简单的程序看起,揣摩别人的思想和意图。

          2、多抄:挑选难度合适的别人编写好的代码,亲自去尝试一下运行的结果。在不断地借鉴别人的代码过程中,你的思维会不断升级。

          3、多改:正所谓“青出于蓝胜于蓝”,把自己的思想融入别人的思想中,那么你就得到了两种思想。

          4、多实践:不要用纸和笔来写程序。没有人能保证那样写出来的程序一定能执行。一定要勤上机、勤测试,那样,你的水平才能真正提高。

          5、有风格:一名优秀的程序员都有着自己良好的风格习惯。至于这种良好的习惯如何养成,以后会在各章节陆续介绍。

          必要准备——五“要”

          1、要有一定能学会的信心和坚持到底的决心。

          2、要有足够的时间去经常写程序,经常去实践。长时间不写程序,水平就会退步。

          3、要有良好的身体素质。做程序员很伤身体,废寝忘食更是家常便饭。

          4、要有一定的电脑常识和实践操作基础。

          5、要有电脑和相关软件。

          7.如何创建一个示例程序

          首先,我们要进入Microsoft Visual C++集成开发环境(IDE——Integrated Develop Environment),双击图标即可。进入以后,我们可以看到如下界面。(图2.1.1)

          单击左上角的File菜单(Menu),选择New,会跳出如下对话框。(图2.1.2)

          图2.1.2所在的是Project(工程)选项卡。设计程序就好像造房子需要图纸、建筑材料和建筑工具一样,也需要各种各样的东西,如程序代码、头文件或一些额外的资源。这些东西都是放在一个工程里的。工程能够帮助协调组织好这些文件和资源,使得设计更有序,查找更方便。注意,每一个工程只能对应一个设计的程序,切莫把多个程序一股脑儿塞在一个工程里!

           

          左面部分是提供工程类型的选择,即我们要设计何种类型的程序。我们要学习的是控制台应用程序,所以选择Win32 Console Application(如图)。右边的Project Name为工程名,应该不难理解。而Location则是工程保存的位置,如果你对保存位置这个概念还不清楚,那么请查阅一些初学者的参考书。要说明的是,当在Location下新建一个工程后,会在Location这个位置下新建一个以工程名命名的文件夹。而通过打开这个文件夹中的“工程名.dsw”文件可以打开该工程。

           

          选好类型,填好工程名和保存位置,按“OK”,又出现了如下对话框(图2.1.3)。

          该对话框问我们要创建哪种控制台应用程序,我们要创建一个“Hello,World!”的示例程序,所以我们选第三项(如图)——A “Hello,World!” application。(思考:如果我们要自己编一个控制台应用程序,我们应该选哪个?)

          单击Finish后,会弹出一个关于新工程信息的消息框,再次点击OK后,示例工程出现。找到Workspace框(事实上这个框上没有这个名称,该框在整个集成开发环境左方),单击File View,将所有树状目录点开,如图2.1.4。

          我们可以看到三个文件夹结构,分别是Source Files(源文件)、Header Files(头文件)和Resource Files(资源文件)。源文件主要是存放设计的主程序代码,头文件主要是存放一些预处理文件(关于什么是预处理文件,后面会另作介绍),资源文件一般是存放一些运行该程序所必需的一些资源,比如图像,文本等类型的文件。不过,这里的文件夹结构并不是磁盘上的文件夹结构,而只是这些文件在该工程中的分类。所以,如果你没有自己创建过这些名字的文件夹,那么在工程中是无法找到这些文件夹的。

           

          双击某个文件,即可查看它的内容。本节只是介绍如何创建一个程序,所以对各文件内的代码不作介绍。

          最后要介绍如何让设计好的程序运行起来。先要打开主程序代码文件(本例中为StdAfx.cpp),然后点Build菜单,再点Compile StdAfx.cpp(编译)。所谓编译,就是使用编译器软件将我们比较容易掌握的高级语言翻译成计算机可以识别的低级语言。如果没有经过编译(或解释),高级语言的程序代码是无法被执行的。

           

          完成编译后,还要再点Build菜单,点Build 工程名.EXE。我们通常把这个过程称为连接(Linking),其作用是将多个源文件的程序模块都整合起来。当一个程序规模比较大的时候,连接也成为保证程序能正常运行的关键步骤之一。

           

          最后再点Build菜单里的Execute 工程名.EXE(执行),就能运行程序,并查看结果了(如图2.1.5)。以后熟练了就可以使用快捷键或快捷按钮。如果代码完全正确且能正常Compile,但是Build的时候提示有错误,请检查是否上次运行了程序之后没有将它关闭。

           

          8.创建自己的World

          上一节我们介绍了如何创建一个“Hello,World!”示例程序,这一节我们要来自己动手写一个程序。

          参照上一节的方法,我们创建一个控制台应用程序的工程,在选择类型的时候选An Empty Project,即一个空工程。该工程中没有任何文件或代码。

          然后,我们要开始准备写代码了。可是,没有任何文件我们写在哪里呢?所以,我们先要新建一个源文件。点击File菜单,按New,这次会出现如下对话框(图2.2.1)。

          当我们打开着一个工程再按New的时候,出现的默认选项卡是Files,即向打开的工程中添加新文件。在左边选择文件类型为C++ Source File表示我们要新建一个源文件。在右边的File中填入文件名,按OK以后,就会在Workspace框的Source Files里面出现这个新建的文件,文件扩展名为cpp,如左图所示(图2.2.2)。

          双击该文件,使其处于打开状态,然后在文本框内输入以下代码:

          #include "iostream.h"
          int main()
          {
          cout<<"My Own World!";
          return 0;
          //(图2.2.2)
          }

          我们来试一试运行一下,可以看到屏幕上有这样的结果。

          My Own World!Press any key to continue

          下面我们来一句一句地分析一下每个语句的意思。

          #include "iostream.h"   //包含“iostream.h”文件,该文件使得设计的程序具有输入输出功能。
          int main()             //主函数,每个程序只能有并且必须有一个主函数,在没有系统地介绍函数之前,只能认为这是一种定式。
          cout<<"My Own World!";//你可以猜测一下,这个cout(念C-Out)起到了什么功能。“<<”称为插入操作符,在下一节输入输出中将予以介绍。在My Own World两端加上引号表示它是一个字符串,是一个整体。
          return 0;           //主函数的返回值,暂时也认为是一种定式。
          
          

          根据程序中的cout语句,我们可以归纳出cout的语法格式:
          cout <<字符串

          在语法格式中,中括号一般表示根据实际需要,可有可无的内容。要注意,在实际输入代码的过程中,中括号是不需要输入的。如果我们要输出多个字符串,则可以通过多加一些插入操作符和字符串来实现。而在语句的最后,我们要加上一个“;”。在C++中,分号表示一句语句的结束,但是它的位置是有一定规则的,待介绍了更多语句后,再作归纳。

          刚才我们发现在代码中键入“//”后的字符串都会变成绿色,而且无论这些字符串是什么,对程序的运行结果都不会产生影响。这叫作注释,是程序员对某句语句的一个解释,方便自己或别人理解这句语句的意思。写注释是一种好习惯,能够及时把自己当时的思路记录下来,但是这并不是说注释越多越好。在一些很简单的、显而易见的语句后加上注释便是多此一举了。“//”称为单行注释符,当注释要占用多行时,可以用“/*”表示注释的开始,用“*/”表示注释的结束。尽管如此,注释还是应点到为止,从简为宜。

          最后,我们通过这个程序总结出一个简单而完整的C++程序代码结构:

          预处理头文件

          主函数

          {

          语句1;//注释

          ……

          }

          试试看:

          1、如果去掉第一行的#include “iostream.h”,该程序能否正常运行?

          结论:去掉预处理头文件将影响某些功能的实现。

          2、如果去掉字符串两端的双引号,是否还能输出这些字符?

          结论:输出字符串不能将两端的双引号丢掉。

          3、如果去掉cout语句后的分号,编译时会出现什么错误提示?

          4、试试cout<<3+4;会是什么结果。

          1 [<<字符串2 …… <<字符串]; n

          9.输入与输出

          我们已经学会如何用cout语句输出字符串,那么cout能否输出别的东西呢?如果你已经做了上一节试试看的第四题,那么你会发现,cout还能够输出运算的结果。

          你有没有想过,用现在的知识,能否输出一个回车符或者一些键盘上没有的字符呢?事实上还不能。在此,我们引入一个转义字符的概念,即用多个键盘上有的字符来表示一些键盘上没有或者不方便输出的字符。转义字符仍作字符处理,加在字符串的双引号内。以下给出的是常用转义字符表:

          在C++中,还有一种更为常用的输出换行的方法,为cout <<endl;,以后再程序中会经常遇到。

          试试看:

          1、试输出My Own World!后换行。

          2、试输出”My Own World!”后换行。

          3、试输出My Own World!的同时发出响铃。

          out是出的意思,那么输入是不是in呢?没错,输入就是cin(念C-In)。它的语法格式和cout很类似:

          cin >>变量1 [>>变量……>>变量]; 2n

          我们发现,在cin语句中,双箭头的方向和插入操作符的方向相反。“>>”叫做抽取操作符。虽然这两个符号的名字都比较难记,但是它们的功能却很好理解。“<<”是箭头从字符串指向外面,好像把东西从字符串里拿出来,所以就是输出功能;而“>>”是箭头指向变量,好像是把东西放进去,所以就是输入功能。

          关于变量的具体知识,我们会在下一章作详细的讲解。现在大家只要记住,输入的时候东西一定要放到变量里。下面我们来试一段程序:(程序2.3)

          #include "iostream.h"
          int main()
          {
          char a; //创建一个字符变量a
          cout <<"请输入字符:"; //输出提示消息
          cin >>a; //把键盘输入的字符放入变量a
          cout <<"刚才输入的字符是" <<a <<endl; //输出提示消息并把变量a里的字符输出
          return 0;
          }

          我们来看看运行结果:

          请输入字符:T
          刚才输入的字符是T
          Press any key to continue

          需要注意的是,如果我们给cout <<"刚才输入的字符是" <<a <<endl;的a加上双引号,那么无论我们输入什么,输出的始终是一个字符a。所以当我们要输出变量中的内容时,千万不能给它加上双引号。

          在运行结果中显示的“Press any key to continue”是由系统给出的,表示程序已经运行结束。在书中以后的运行结果中,这句话会被省略。

          书中带底纹的字符表示从键盘输入的字符。我们可以看到,我们输入什么,最后的结果就能够输出什么。输入功能达到了我们所需要的效果。而且,通过这个程序,我们还知道了cout不仅能够输出字符串和运算结果,还能输出变量。

          试试看:

          1、在上述程序中,如果输入了多个字符,那么最终输出的应该是哪个字符?

          2、已知对于整数可以通过int a,b;语句来创建一个名为a和b的整数变量,试用输入输出语句实现输出任意两个整数的和。

          3、在执行cin语句时,输入1+1等表达式电脑是否能够识别?

          结论:cin语句中,表达式不能被电脑识别。

        7. 抱歉!评论已关闭.