C++回顾——对象的创建与使用

一、语言的翻译过程
任何源代码都要转化成机器指令。通常,翻译器分为两类:解释器和编译器。
1)解释器
解释器将源代码转化成一些动作(可由多组机器指令组成)并立即执行这些动作。现在许多的解释器,先把整个程序转化成某种中间语言,然后由执行速度更快的解释器来执行。
解释器的优点:较好的交互性和适于快速程序开发,缺点:执行速度慢、难以调试(不隔离不同代码段的影响)。
2)编译器
编译器直接把源代码转化成汇编语言或机器指令。
编译器的优点:编译后的程序小、运行速度快。
编译一般分两遍:对预处理过的代码进行语法分析、由代码生成器遍历语法分析树,把树的每个节点转化成汇编语言或机器代码(有时会使用窥孔优化器从相邻一段代码中查找冗余汇编语句)。
C++使用静态类型检查,因为它不采用任何特殊的运行时支持来处理错误操作。在C++里可以不使用静态类型检查,这就需要自己做动态类型检查。

二、声明与定义
声明是向编译器介绍名字——标识符,它告诉编译器“这个函数或变量在某处可找到,它的模样像什么”。定义为名字分配存储空间,“在这里建立函数或变量”(ODR(one-definition rule),单一定义规则),定义也可以是声明。
1)函数的声明
给函数取名、指定函数的参数类型和返回值。在函数声明时,可以给参数命名,编译器会忽略参数名,但对程序员来说它可以帮助记忆。对于带空参数表的函数,C和C++有很大的不同,在C中,表示“一个可带任意参数(任意数目,任意类型)的函数”;在C++中,表示“不带参数的函数”。
2)函数的定义
其带有函数体(用大括号括起来的语句集)。如果要在函数体中使用参数的话,函数定义中的参数必须有名称。在C中,函数定义时要求要有标识符,而在C++中,是可选的。
3)变量的声明
变量声明告知编译器变量的外表特征,是类型标识后面跟一个标识符(变量的定义形式也是如此)。在变量定义前加extern关键字表示声明一个变量但不定义它,表示变量是在文件以外定义的,或在文件后面部分才定义。

三、包含头文件
头文件是一个含有某个库的外部声明函数和变量的文件,通常扩展名为“.h”的文件(较老的程序可能使用其他扩展名,如“.hxx”或“.hpp”)。
包含头文件,要使用#include预处理命令,它告诉预处理器打开指定的头文件并在#include语句所在的地方插入头文件。#include有两种方式来指定文件:尖括号(<>)或双引号。
用尖括号来指定文件时,预处理器以特定的方式来寻找文件,一般是环境中或编译器命令行指定的某种寻找路径。这种设置寻找路径的机制随机器、操作系统、C++实现的不同而不同,要视具体情况而定。
用双引号来指定文件时,预处理器以“定义实现的途径”来寻找文件,它通常是从当前目录开始寻找,如果文件没有找到,就按与尖括号同样的方式重新开始寻找。
从C继承下来的带有传统“.h”扩展名的库仍然可用,也可用更现代的C++风格,即在文件名前加一个字母“c”(如果想使用这种没有扩展名的风格,但编译器厂商没有提供这种支持,可用将厂商提供的头文件拷贝成没有扩展名的文件)。如果在同一程序中混用这两种形式,会遇到某些问题。

四、连接
连接器把由编译器生成的目标模块(一般是“.o”或“.obj”扩展名的文件)连接成操作系统可以加载和执行的程序,它是编译过程的最后阶段。如果连接的时候遇到一些莫名其妙的问题,可能与给定连接器的文件顺序有关。

五、使用库文件
使用库必须:
1)包含库的头文件;
2)使用库中的函数和变量;
3)把库连接进可执行程序。
目标模块没有加入库时,也可执行上述步骤。
1、连接器如何查找库
如果还未遇到过这个函数或变量的定义,连接器会把它的标识符加到“未解析的引用”列表中;如果连接器遇到过函数或变量定义,那么这就是已解决的引用。如果连接器在目标模块列表中不能找到函数或变量的定义,它就去查找库。连接器不必到库里查找所有目标模块,只需要浏览索引(仅仅是库中包含所需要定义的目标模块加入连接,而不是整个库参加连接)。因为连接器按指定顺序查找文件,所以,把带有和库函数同名的函数的文件插入到库文件之前,就能用自己定义的函数取代库函数(C++名字空间禁止这样做)。
2、秘密的附加模块
当创建一个C/C++可执行程序时,连接器会秘密连接某些模块(如启动模块,包含了对程序的初始化例程)。如果要使用附加的库,必须把该库文件名添加到由连接器处理的列表文件中(标准库只要包含所需的头文件即可)。

六、命名空间
标准C++有预防名字冲突的机制:namespace关键字。每一个C++定义集被封装在一个名字空间中,如果其他的定义中有相同的名字,但它们在不同的名字空间,就不会产生冲突。(名字空间和包含头文件的方法之间存在着相互关系,以后会单独介绍)

猜你喜欢

转载自blog.csdn.net/zlanbl085321/article/details/80745005