第1章
绪论
(视频讲解:1小时18分钟)
C++是当今流行的编程语言,它是在C语言基础上发展起来的,随着面向对象编程思想的发展,C++也融入了新的编程理念,这些理念有利于程序的开发。C++从语言角度来说也是一个规范,随着规范的发布,许多C++编译器不断涌现,不同的C++编译器也带来不同的语言特性,这给程序员带来了广阔的选择空间。
通过阅读本章,您可以:
了解C++的发展历程
了解为C++发展做出杰出贡献的人物
掌握主要的C++编译器及开发环境
掌握C++项目文件及编译工程
1.1 C++历史背景
要学一门语言,首先要对这门语言有一定的了解,要知道这门语言能做什么,要怎样才能学好。本节将对C++语言的历史背景进行简单的介绍,使读者对C++语言有一个简单而直接的印象。
1.1.1 20世纪最伟大的发明
计算机的出现给我们的生活带来了巨大的变化,它是如何发展起来的呢?开始时人们致力研究的能够进行四则运算的机器,是通过机械齿轮运作的加法器,而后是精度只有12位的乘法计算器,直到1847年Charles Babbages开发出能计算31位精度的机械式差分机,这台差分机被普遍认为是世界上第一台机械式计算机。随着电子物理的发展,真空二极管、真空三极管问世,到1939年第一部用真空管计算的机器被研制出来,该机器是能进行16位加法运算的机器;随后,用氖气灯(霓虹灯)的存储器、复杂数字计算机(断电器计数机)、可编写程序的计数机,被一一研制出来。1946年,第一台电子管计算机ENIAC在美国被研制出来,这台计算机占地170平方米,重30吨,有1.8万个电子管,用十进制计算,每秒运算5000次。计算机从此进入了电子计算机时代,经历了真空管计算机、晶体管计算机、集成电路计算机、大规模集成电路计算机4个阶段,每一个阶段都是随着电子物理的发展而发展的,晶体管的出现取代了电子管,将电子元件结合到一片小小的硅片上,形成集成电路(IC),在一块芯片上容纳几百个或是几千个电子元件形成了大规模集成电路(LSI),直到现在已经出现了很薄的电子芯片,可谓是发展迅速。
现在计算机已经应用到各个领域,科学计算、信号检测、数据管理、辅助设计都在使用计算机,人们的生活已经渐渐离不开它,所以说计算机是20世纪最伟大的发明。
1.1.2 C++发展历程
早期的计算机程序语言就是计算机控制指令,每条指令就是一组二进制数,不同的计算机都有不同的计算机指令集。使用二进制指令集开发程序是一件很头痛的事,需要记住大量的二进制数,为了便于记忆,人们将二进制数用字母组合代替,以字符串关键字代替二进制机器码的编程语言称为汇编语言,汇编语言被称为是低级语言,虽然汇编语言比机器码容易记忆,但仍然具有可读性差的缺点,大量的跳转指令和地址值很难让程序员在很短的时间理解程序的意思,于是编程语言进入了高级语言时代。
第一种高级语言是美国尤尼法克公司在1952年研制成功的Short Code,但被广泛使用的高级语言是FORTRAN,它是由美国科学家John Backus设计并在IBM公司的计算机上实现的,但FORTRAN语言和ALGOL60主要应用于科学和工程计算,随后出现了Pascal和C语言。C语言是在其他语言基础上发展起来的。首先是Richard Martin开发一种高级语言BCPL,随后Ken Thompson使用BCPL语言对其进行了简化,形成一门新的语言—B语言,但B语言没有类型的概念,Dennis Ritchie对B语言进行研究和改进,在B语言基础上添加了结构和类型,并将这个改进后的语言命名为C语言,寓意很简单,因为字母C是字母B的下一个字母,预示着语言的发展。
本书所讲述的C++语言就是从C语言发展过来的。Stroustrup经过钻研在C语言中加入了类的概念,C++最初的名字是C with Class,到1983年12月由Rick Mascitti建议改名为C Plus Plus,即C++。最开始提出类概念的语言是Simula,它具有很高的灵活性,但无法胜任比较大型的程序。此后在Simula语言基础上发展的语言Smalltalk才是真正的面向对象语言,但Smalltalk-80不支持多继承。
C++从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。
1.1.3 C++中的杰出人物
Dennis M. Ritchie
Dennis M. Ritchie被称为C语言之父,UNIX之父,生于1941年9月9日,哈佛大学数学博士,曾任朗讯科技公司贝尔实验室(原AT&T实验室)下属的计算机科学研究中心系统软件研究部的主任一职。他开发了C语言,并著有《C程序设计语言》(The C Programming Language)一书,还和Ken Thompson一起开发了UNIX操作系统。他因杰出的工作得到了众多计算机组织的公认和表彰,1983年,获得美国计算机协会颁发的图灵奖(又称计算机界的诺贝尔奖),还获得过C&C基金奖、电气与电子工程师学会优秀奖章、美国国家技术奖章等多项大奖。
Bjarne Stroustrup
Bjarne Stroustrup 1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和英国剑桥大学,AT&T大规模程序设计研究部门负责人,AT&T贝尔实验室和ACM成员。1979年,Stroustrup开始开发一种语言,当时称为C with Class,后来演化为C++。1998年,ANSI/ISO C++标准建立,同年,Stroustrup推出其经典著作The C++ Programming Language的第3版。
Scott Meyers
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
Andrei Alexandrescu被认为是新一代C++天才的代表人物,2001年撰写了经典名著Modern C++ Design,其中对Template技术进行了精湛运用,第一次将模板作为参数在模板编程中使用,该书震撼了整个C++社群,开辟了C++编程领域的Modern C++新时代。此外,他还与Herb Sutter合著了C++ Coding Standards。他在对象拷贝(object copying)、对齐约束(alignment constraint)、多线程编程、异常安全和搜索等领域做出了巨大贡献。
Herb Sutter
Herb Sutter是C++ Standard Committee的主席,作为ISO/ANSI C++标准委员会的委员,Herb Sutter是C++程序设计领域屈指可数的大师之一。他的Exceptional系列3本书(Exceptional C++、More Exceptional C++和Exceptional C++ Style)成为C++程序员必读书。他是深受程序员喜爱的技术讲师和作家,是C/C++ Users Journal的撰稿编辑和专栏作者,曾发表了上百篇软件开发方面的技术文章和论文。他还担任Microsoft Visual C++架构师,和Stan Lippman一道在微软公司主持VC 2005(即C++/CLI)的设计。
Andrew Koenig
Andrew Koenig是AT&T公司Shannon实验室大规模编程研究部门中的成员,同时也是C++标准委员会的项目编辑,是一位真正的C++内部权威。Andrew Koenig的编程经验超过30年,其中有15年在使用C++,已经出版了超过150篇和C++有关的论文,并且在世界范围内就这个主题进行过多次演讲,对C++的最大贡献是带领Alexander Stepanov将STL引入C++标准。
1.2 常用开发环境
在使用C++语言时,需要选择一款开发环境,那么有哪些环境可供用户选择呢?下面就对一些常用的C++语言开发环境进行简单的介绍。
1.2.1 Visual C++ 6.0
Visual C++ 6.0是由微软公司开发的C++开发环境,它是Visual Studio集成开发环境中的一员。Visual C++ 6.0可以创建Windows应用程序、DLL动态链接库、COM组件以及ActiveX控件等。Visual C++ 6.0开发环境如图1.1所示。
图1.1 Visual C++ 6.0开发环境
1.2.2 Visual Studio 2017
Visual Studio 2017是目前比较流行的开发环境,它更加支持C++标准规范,而且还支持托管程序的编译和WebService。应该说Visual Studio 2017更加强大,无论是功能上还是编译速率上都有很大提高。Visual Studio 2017开发环境如图1.2所示。
图1.2 Visual Studio 2017开发环境
1.2.3 GCC/G++
Linux系统中一般都会带有C/C++的编译器,能够编译C代码的是GCC,能够编译C++代码的是G++,如果是在没有GDK或GDE等界面系统的Linux系统下,编写代码需要使用VI文本命令,它和DOS下的TYPE命令很像,由于没有鼠标,只能顺序地编写代码,使用它编写代码对于程序员来说相当地不方便。但在有界面的Linux系统下,系统都会提供可视化的文本编辑器,其中比较有名的就是emacs,因为emacs集成了编译代码的菜单,通过emacs可以直接编写代码并编辑,并且可以直接执行编译后的程序。emacs开发环境如图1.3所示。
图1.3 emacs开发环境
1.2.4 Dev-C
Dev-C是将Linux系统的GCC/G++移到Windows系统后的产物,具体来讲,编译代码的程序是GCC.exe和G++.exe,这两个程序属于开源项目mingw, Dev-C只是能够调用GCC.exe和G++.exe来编译程序的代码编辑器。Dev-C开发环境如图1.4所示。
图1.4 Dev-C开发环境
1.2.5 Eclipse
Eclipse是IBM开发的、早期用来编写Java代码的编辑器,但由于CDT插件的出现,使Eclipse也可以用来编写C/C++代码,同Dev-C一样,Eclipse也使用开源项目下的GCC.exe和G++.exe来编译代码,所以在使用Eclipse前一定要注意设置好相关路径。Eclipse开发环境如图1.5所示。
图1.5 Eclipse开发环境
1.3 认知C++程序代码
C++程序代码是由预编译指令、宏定义指令、注释、主函数、自定义函数等很多部分组成的,这些部分都是后文讲述的主要内容。下面是一段很短但涉及C++语言概念比较多的代码,如图1.6所示。
如图1.6所示的代码中还有头文件引用、函数作用空间、库函数调用、赋值运算、关系判断、流输出等很多C++语言方面的概念,各概念之间通过一定规则罗列在一起,编译器会根据这些规则将代码编译成能够在机器上执行的应用程序。
图1.6 代码介绍
1.4 C++工程项目文件
Windows操作系统主要是用来管理数据的,而数据是以文件的形式存储在磁盘上的。文件可以通过扩展名来区分不同的类型,C++的代码文件就有两种类型,一种是源文件,一种是头文件。头文件中添加的是定义和声明函数部分,源文件中则是在头文件中定义函数的实现部分;源文件主要以cpp为扩展名,而头文件主要以h为扩展名。有的开发环境可能使用cxx、cHH来作为源文件的扩展名。
对一个比较大的工程而言,它的源文件和头文件可能会比较多,为了管理这些源文件,不同的编译器还提供了管理代码的工程项目文件,不同开发环境的工程项目文件也会不同。
(1)Dev-C的工程项目文件如图1.7所示。
main.cpp:源文件。
Sample.dev:工程文件。
Makefile.win:make程序执行时使用的文件,用于自动编译源代码文件。
main.o:编译后的目标文件。
Sample.exe:连接后生成的程序。
(2)Visual C++ 6.0的工程项目文件如图1.8所示。
图1.8 Visual C++ 6.0的工程项目文件
Debug:存储编译后程序文件夹,带有调试信息的程序。
Release:存储编译后程序文件夹,最终程序。
Sample.cpp:源文件。
Sample.dsp: Visual C++ 6.0的工程文件。
Sample.dsw: Visual C++ 6.0的工作空间文件。
Sample.ncb: Visual C++ 6.0的用于声明的数据库文件。
Sample.opt: Visual C++ 6.0存储用户选项的文件。
StdAfx.cpp:向导生成的标准源文件,代码中涉及MFC类库内容时使用该文件。
StdAfx.h:向导生成的标准头文件。
注意
Debug与Release的区别在于,Debug是含有调试信息的应用程序,Debug文件夹下的程序可以设置断点调试,而且Debug文件夹下的程序要比Release文件夹下的程序大。
(3)Eclipse的工程项目文件如图1.9所示。
图1.9 Eclipse的工程项目文件
.cproject: Eclipse工程相关信息文件。
.project: Eclipse工程文件。
Makefile:make程序执行时使用的文件,用于自动编译源代码文件。
Sample.cpp:源文件。
Sample.exe:连接后生成的程序。
Sample.o:编译后的目标文件。
通过工程项目文件的扩展名,就可以知道代码文件使用哪种开发环境管理。
1.5 使用Visual C++ 6.0创建程序
Visual C++ 6.0可以通过两种方式创建输出Hello World!程序,一种是使用向导直接创建,一种是创建空工程后,手动向工程中添加源文件并写入代码。
1.使用Visual C++ 6.0创建输出Hello World!程序
具体创建步骤如下:
(1)启动Visual C++ 6.0,选择File→New命令,弹出创建工程向导,如图1.10所示。
图1.10 Visual C++ 6.0创建工程向导
(2)在左侧的工程列表中选择Win32 Console Application工程类型,在Project name中输入工程名Sample,在Location中设置工程的保存路径D:\桌面\LIZI\Sample。然后单击OK按钮,弹出Win32 Console Application-Step 1of 1对话框,如图1.11所示。
图1.11 Visual C++ 6.0工程向导对话框
(3)向导可以创建4种类型的工程。
An empty project:创建一个空的工程,工程中没有任何源文件和头文件。
A simple application:创建的工程中含有两个源文件(Sample.cpp和StdAfx.cpp)和一个头文件(StdAfx.h),并且Sample.cpp源文件中有一个不做任何操作的main函数。
A "Hello,World!" application:创建的工程中也含有两个源文件(Sample.cpp和StdAfx.cpp)和一个头文件(StdAfx.h),但Sample.cpp源文件中的main函数有一条输出Hello,World!字符的printf语句。
An application that supports MFC:创建了支持MFC类库的工程。MFC类库由微软公司开发,使用MFC类库可以加快程序开发的速度。
(4)选择A "Hello,World!" application工程类型,单击Finish按钮,向导会创建能够在控制台输出Hello World!字符串的应用程序。创建完的工程如图1.12所示。
图1.12 创建完的工程
(5)此时通过选择Build→Execute命令执行应用程序就可以看到程序运行结果,如图1.13所示。
图1.13 程序运行结果
2.创建空工程,手动添加代码文件实现在控制台输出字符串Hello World!
创建步骤如下:
(1)启动Visual C++ 6.0,选择File→New命令,弹出创建工程向导。
(2)在列表中选择Win32 Console Application工程类型,在Project name中输入工程名Sample,在Location中设置工程的保存路径D:\桌面\LIZI\SAMPLE\Sample。然后单击OK按钮,弹出Win32 Console Application-Step 1of 1对话框。
(3)在弹出的对话框中选择An empty project工程类型,单击Finish按钮,向导会创建一个空的工程。
(4)通过向导向工程中添加源文件。选择File→New命令,弹出创建工程向导,选择Files选项卡,在列表中选择C++ Source File,在File中输入文件名Sample,如图1.14所示。
图1.14 添加文件对话框
(5)单击OK按钮后,向导会向工程中添加Sample.cpp文件。
(6)在Sample文件中输入如下代码:
(7)选择Build→Execute命令执行应用程序就可以看到程序运行结果。
1.6 编译与连接过程
开发应用程序可以分为编辑、编译、连接、执行4个步骤。
(1)编辑
编辑就是在文本编辑器中输入代码,并对代码字符进行增、删、改,然后将输入的内容保存成文件。如图1.15所示,输入Hello World程序代码,并将代码保存成Sample.cpp文件。
图1.15 编辑代码
(2)编译
编译就是将代码文件编译成目标文件。如图1.16所示,编译过程就是将Sample.cpp编译成Sample.obj。
在Visual C++ 6.0开发环境中,单击编译按钮后Visual C++ 6.0开发环境对输入的代码进行编译,如图1.17所示。
图1.16 编译文件
图1.17 执行编译命令
单击编译按钮后Visual C++ 6.0开发环境自动对代码进行编译和连接,整个编译过程如图1.18所示。
图1.18 编译过程
(3)连接
连接就是将编译后的目标文件连接成可执行的应用程序。如将Sample.obj和lib库文件连接成Sample.exe可执行程序。lib库是编译好的提供给用户使用的目标模块,在有多个源文件的工程,例如Sample1.cpp、Sample2.cpp、Sample3.cpp,会编译成多个目标模块Sample1.obj、Sample2.obj、Sample3.obj,链接器会将程序所涉及的目标模块连接成可执行程序,如图1.19所示。
图1.19 连接过程
(4)执行
执行就是执行生成的应用程序。Visual C++ 6.0开发环境下集成了运行按钮,单击运行按钮后开发环境自动执行生成的程序,运行按钮如图1.20所示。
图1.20 运行按钮
1.7 C++的特点
C++语言的运算符十分丰富,共有30多个,有算术、关系、逻辑、位、赋值、指针、条件、逗号、下标、类型转换等多种类型。
C++语言的数据结构多样,有整型、实型、字符型、枚举类型等基本类型,有数组、结构体、共用体等构造类型以及指针类型,还为用户提供了自定义数据类型,能够实现复杂的数据结构,还可以定义类实现面向对象编程,类和指针结合可以实现高效的程序。
C++语言的控制语句形式多样,使用方便。有两路分支、多路分支和虚幻结构几种控制语句,便于结构化模块的实现和控制,结合面向对象编程便于程序的编制和维护。
C++语言是一种面向对象的程序设计语言,采用抽象和实际相结合,各对象间使用消息进行通信,对象通过继承方法增加了代码的复用。
C++语言继承了C语言的特性,可以直接访问地址,进行位运算,从而能对硬件进行操作。C++语句具有编写简单方便、便于理解的优点,还具有低级语言的与硬件结合紧密的优点。
C++语句具有很强的移植性,用C++编写的程序基本不用太多修改就可以用于不同型号的计算机上,C++标准可在多种操作系统下使用。
1.8 小结
任何编程语言都有它的时代性,都是不断发展的,C++现在是一个成熟的语言,首先要理解C++语言新的编程理念,然后选择自己喜欢的开发环境,可以选择微软公司的Visual C++ 6.0,还可以选择Dev-C或Eclipse。