luqingfei@C++

为中华之崛起而崛起!
兼听则明,偏听则暗。

C++入门经典:(一)基本概念

基本概念

编程语言

除了C++之外,还有Java、BASIC、COBOL、FORTRAN、PASCAL和C(只是因为它是B语言的后续语言)等编程语言。
所有这些称为高级语言,因为它们可以比较容易地表达出要计算机完成的工作,而且不针对某台计算机。
高级语言中的每个源语句一般映射为几个内部机器指令。
低级语言比较接近内部机器指令,通常称为汇编语言,一个汇编语言专门用于一种硬件设计,一般一个汇编指令映射为一个内部机器指令。

编程语言简史
FORTRAN是第一种开发出来的高级语言,第一个FORTRAN编译器是在19世纪50年代后期开发出来的。
已有40多年的历史了,目前仍广泛应用于科学和工程计算中,但C++和其他语言也逐渐进入这些领域。

COBOL语言专门用于商务数据处理应用程序,它的历史几乎与FORTRAN语言一样长,目前几乎不用COBOL编写代码。

BASIC在19世纪70年代诞生,那时已经有了个人计算机的概念。有趣的是,Microsoft销售的第一个产品是一个BASIC解释程序。
这种语言所固有的易用性使之很快普及,直到今天仍非常流行。

Java是在19世纪90年代开发的,它最初开发为Oak语言,用于给小型电子设备编程。
1995年,Oak演变为Java语言,可以在Web页面中内嵌代码,从那时起直到现在,这已经成为Java的主要用途。
Java成功的主要原因是它的可移植性。Java程序可以在任何支持它的硬件平台上运行,而且不需要任何修改。
Java语言的语法有许多特性,使它看起来很像C++,但有很大的区别。Java在可移植性方面比C++好,但执行性能比不上C++。

C在上个世纪70年代被开发为一种高级语言,用于低级编程,例如实现操作系统。大多数Unix操作系统就是用C编写的。


C++是19世纪80年代早期开发的,是一种基于C的面向对象语言。
顾名思义,C++表示C的累加。
由于C++基于C,所以这两种语言有许多共同的语法和功能,C中所有低级编程的功能都在C++中保留下来。
但是,C++比其前身丰富得多,用途也广泛得多。
C++对内存管理功能进行了非常大的改进,C++还具有面向对象的功能,所以C在功能上只是C++的一个很小的子集。
C++在适用范围、性能和功能上也是无可匹敌的。
因此,目前大多数高性能的应用程序和系统仍使用C++编写。


解释性程序和编译性程序的执行过程
无论使用哪种编程语言,编写出来的程序都是由各个指令或源语句构成的,它们描述了希望计算机执行的动作。
这些指令或源语句统称为源代码,存储在磁盘的源文件中。
任何规模的C++程序都是由若干个源文件组成的。

编程语言的目的是,与计算机可以执行的程序相比,能够更简单地描述希望计算机执行的动作。
计算机只能执行包含机器指令(也称为机器代码)的程序,不能直接执行我们编写的程序。

用前面提到的语言编写的程序基本上有两种执行方式,在大多数情况下,一种语言会选择其中一种执行方式。
例如,用BASIC语言编写的程序通常是解释性的,
也就是说,另一个称为解释器的程序会检查BASIC源代码,确定该程序要做什么,再让计算机完成这些动作。

而C++是一种编译语言。在执行C++程序之前,必须用另一个程序(即编译器)把它转换为机器语言。
编译器会检查并分析C++程序,并生成机器指令,以执行源代码指定的动作。
当然,解释和编译都不像这里描述的那样简单,但其工作原理就是这样。

使用解释性语言,执行过程是间接的,也就是说,每次执行程序时,都需要确定源代码的意图。
因此,这种语言比编译语言的对应程序的执行速度慢得多,有时要慢100倍。
其优点是在运行之前,不必等待程序的编译。
使用解释性语言,一旦输入代码,就可以立刻执行程序。

任何一种语言要么是解释性,要么是编译性的,这通常是由该语言的设计和用途来决定。
前面说过BASIC是一种解释性语言,但这不是绝对的,目前有许多BASIC语言的编译器。

没有所谓“最好”的语言,因为这取决于环境。
看具体环境在意的是开发速度,还是运行速度,又或是移植能力等等。



每次编写程序时,如果总是要从头开始编写,就相当繁琐。
为了解决这个问题,编程语言通常提供了大量预先编写好的代码,以执行标准的操作,这样就不必重新编写这些代码了。
可用于任意程序的标准代码都保存在一个库中。
编程语言附带的库跟语言本身一样重要,因为库的质量和使用范围对完成某一编程任务所需的时间有非常大的影响。

C++是一种功能强大的语言

C++的ANSI/ISO标准


名称
C++程序中的许多元素都有用来表示它们的名称,也称为标识符。
在C++程序中,可以命名的5种元素是:
函数、变量、类型、标签、命名空间


关键字
C++中有一些保留字,称为关键字,它们在C++语言中有特殊的含义。


C++语句和语句块
语句是指定程序做什么和程序所处理的数据元素的基本单元。

把名称引入源文件的语句称为声明。
声明只是引入名称,指定该名称表示什么,它与定义不同。

定义是分配一些内存,来包含名称所指代的内容。
大多数声明也是定义??????????(这句如何理解??)


变量是内存中一个可以存储数据项的空间。
下面的语句示例声明了一个变量名,定义并初始化了一个变量:
double result = 0.0;
这个语句把名称result声明为一个double类型的变量(声明),
把内存分配给该变量(定义),
并设置其初始值为0.0(初始化)。

可以把几个语句放在一对花括号中,此时这些语句就称为语句块。
函数体就是一个语句块。
语句块也称为复合语句,因为在许多情况下,语句块可以看做是一个语句。

在C++中,在可以放置一个语句的任何地方,都可以放置一个包含在花括号对中的语句块。

语句块可以放在其他语句块内部,这个概念称为嵌套。语句块可以嵌套任意级。

语句块对用于存储数据项的变量有重要的作用。(变量作用域?)

代码的显示样式
注意使用制表符、空格缩进程序语句,显示出这些语句的逻辑;再以一致的方式使用定义程序块的匹配花括号,使块之间的关系更清晰。

程序结构
每个C++程序都由一个或多个文件组成。
根据约定,用于存储源代码的文件有两类:头文件和源文件。
头文件可以包含描述程序所需的数据类型的代码,以及其他类型的声明。
头文件通常用文件扩展名.h来区分,但这不是强制的。
源文件的扩展名是.cpp,它包含了函数声明,即程序的可执行代码。这些代码通常引用在自己的头文件中定义的数据类型的声明或定义。

编译器在编译代码时,需要知道这些声明或定义,因此应在文件的开头通过#include指令指定.cpp文件中需要的.h文件。
#include指令是编译器的一个指令,它可以把指定头文件的内容插入代码,还需要为代码需要的标准库头文件添加#include指令。

编译器提供了大量的标准头文件,其中包含使用标准库功能所需要的声明。
实际上,C++的标准头文件名都没有扩展名,这就把它们与其他头文件区分开来。

程序的函数和执行
C++程序至少包含一个函数main(),但程序一般还包含许多其他函数,一些是自己编写的,另一些是标准库函数。
执行一个函数称为调用函数。在调用函数时,可以给它传送数据项。
在函数执行完后,执行控制返回到调用函数的地方。
函数在执行完毕时,还可以把一个值返回到调用的位置上。
返回值可以存储起来,以备以后使用,也可以参与某种类型的计算,例如算术表达式的计算。


从源文件中创建可执行文件
从C++源代码中创建可以执行的程序模块需要两步:
第一步是编译器把每个.cpp文件转换为对象文件,其中包含了与源文件内容对应的机器码。
第二步是链接程序把编译器生成的对象文件合并到包含完整可执行程序的文件中。

编译器把每个源文件看作一个独立的实体,为每个.cpp文件生成一个对象文件。
然后在链接步骤中,把程序的对象文件和必要的库函数组合到一个可执行文件中。

实际上,编译是一个迭代的过程,编写源码,编译,发现错误,修改源码,再编译,发现错误,再修改,再编译,……


编译
源文件的编译过程包含两个主要阶段,而它们之间的转换是自动的。
第一个阶段是预处理阶段,在正式的编译阶段之前进行。
预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。
#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。还有其他许多预处理指令。

这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境。
一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。
在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。

预处理器一般不能独立于编译器来执行,调用编译器会自动执行预处理过程,之后才编译代码。


链接
编译器为给定源文件输出的是机器码,执行这个过程需要较长时间。
在对象文件之间并没有建立任何连接。
对应于某个源文件的对象文件包含在其他源文件中的定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。
同样,也没有建立同库函数的链接。
实际上,这些函数的代码并不是文件的一部分。
这些工作是由链接程序完成的。


链接程序把所有对象文件中的机器码组合在一起,
并解析它们之间的交叉引用。
它还集成了对象模块所使用的库函数的代码。
这是链接程序的一种简化表示,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立的。
实际上有些链接是动态的,即这些链接是在程序执行时建立的。

链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。
动态建立的函数之间的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种可执行模块——动态链接库或共享库。
动态链接库中的函数链接是程序调用函数时才建立的,在程序调用之前,该链接是不存在的。


动态链接库优点:
动态链接库中的函数可以在几个并行执行的程序之间共享,在执行的多个函数需要动态链接库中的函数所提供的服务时,这将节省同一个函数占用的内存空间。
动态链接库在调用其中的函数之前是不会加载到内存中的,也就是说,如果不使用给定动态链接库中的函数,该动态链接库就不会占用内存空间。

动态链接库是与操作系统紧密相关的一个系统功能。

C++源字符
编写C++语句要使用基本源字符集,这些是在C++源文件中可以显式使用的字符集。
包括:大小写字母,数字,控制字符,一些特殊字符。

在C++中使用的字符定义并没有说明字符的编码方式。编译器将决定用于编写C++源代码的字符在计算机上如何表示。


通用字符集(Universal Character Set, UCS)。
由UCS标准定义的字符编码与Unicode定义的编码相同。


三字符序列
就是用于表示另一个字符的三个字符序列。以前为了表示键盘上没有的字符,这是必不可少的一种方法。
编译器会用对应的字符替代它们,再对源代码进行其他处理。


转义序列
通过转义序列可以把控制字符输入字符常量。转义序列是指定字符的一种间接方式,通常以一个反斜杠\开头。

由于反斜框表示转义序列的开始,因此把反斜杠字符输入一个字符常量的唯一方式是使用两个连续的反斜杠。

转义序列还提供了用键盘不支持的语言来表示字符的一种通用方式,因为可以使用十六进制(基数是16)或八进制(基数是8)数字前置一个反斜杠来指定字符的编码。

由于使用了数字编码,可以用这种方式指定任何字符。

在C++中,十六进制数据以x或X开头。

还可以使用至多3个八进制数字前置一个反斜杠来表示字符。例如\165。没有x或X,就表示该编码应解释为一个八进制数字。

cout << "\n\" Least said\n\t\tsoonest mended.\ "\n\a";
双引号之间的字符串称为字符串字面量。
双引号字符表示该字符串字面量的开始和结束,它们不是字符串的一部分。

字符串内部的双引号不会解释为字符串字面量的结束,这是因为每个双引号的前面都有一个反斜杠,表示这是一个转义序列。


语句中的空白
除了在语句的元素之间或引号中的字符串内用作分隔符之外,编译器会忽略空白。
因此可以在代码中包含任意多个空白,使程序的可读性更高。

在一些编程语言中,语句的结尾是代码行的末尾,但在C++中,语句的结尾用分号表示。
因此,可以把一个语句分散放在好几行代码行上。


程序的注释
C++中注释有两种形式:单行和多行。
单行注释以双斜杠开头(//)。
编译器会忽略双斜杠后面的所有内容。

多行注释以/*开头,以*/结尾。在/*和*/之间的所有内容都被忽略。
注意多行注释不能嵌套,否则会使编译器发出错误消息。


标准库
标准库包含了大量的函数和其他支持实体,增加和扩展了C++的基本语言功能。
标准库的内容是C++的一部分,在语言的语法和语义方面跟C++相同。
C++的标准定义了这两者,所以每个符合该标准的编译器都提供了完整的标准库。

标准库的范围是很特殊的。
使用该标准库将获得非常多的功能,包括基本元素如基本语言支持、
输入输出函数和异常处理(异常是在程序执行中发生的偶然事件,常常是某种错误)、
实用函数,数学例程和各种预先编写好并测试通过的功能。
在程序执行过程中可借助这些功能来存储和管理数据。


使用标准库所需要的定义和声明位于标准头文件中。
C++标准库中的几乎所有内容都是在命名空间std中定义的。


用C++编程

过程化编程方法和面向对象编程方法


小结
C++程序至少包含一个main()函数。
函数的可执行部分由包含在一对花括号中的语句组成。
一对花括号定义了一个语句块。
在C++中,语句用分号结束。
关键字是C++中有特殊含义的一组保留字。程序中的实体不能与C++语言中的任何关键字同名。
C++程序包含在一个或多个文件中。
定义函数的代码通常存储在扩展名为.cpp的文件中。
定义数据类型的代码通常存储在扩展名为.h的头文件中。
C++标准库提供了支持和扩展C++语言的大量功能。
C++中的输入和输出是利用流来执行的,并且需要使用插入和撮运算符,即<<和>>。
面向对象的编程方式需要定义专门用于某程序的新数据类型。一旦定义好需要的数据类型,就可以根据这些新数据类型来编写程序。

 

posted on 2010-10-18 09:32 luqingfei 阅读(798) 评论(0)  编辑 收藏 引用 所属分类: C++基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

留言簿(6)

随笔分类(109)

随笔档案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜