C++——对象的创建与使用(一)

来源:互联网 发布:php pack 打包字符串 编辑:程序博客网 时间:2024/05/22 06:16

(1) 类(class)是一种新的数据类型,可以将类作为一种内置的数据类型来使用;通常将创建好的类存放在库里;


2.1 语言的翻译过程


(2) 任何一种计算机语言都要从源代码转化成机器指令。翻译器有两类:解释器(interpreter)和翻译器(compiler)


2.1.1 解释器

解释器将源代码转化成一些动作(由多条机器指令组成)并执行这些动作。

优点:较好的交互性和程序快速开发;

缺点:开发大型项目时,解释器必须驻留在内存中以执行程序,同时要求一次行输入整个源代码,这会造成内存空间的限制,并且代码段之间相互影响会导致难以调试。


2.1.2 编译器

编译器直接将源代码转化成汇编语言或机器指令,最终得到一个或多个机器代码的文件

优点:生成的程序只需较少的运行空间,执行速度更快;

缺点:转化过程复杂,从写源码转到执行代码是一个较长的过程(采用内存中编译(in-memory compilation),即将编译器存放在RAM中,以提高编译速度);交互性差(目前通过源代码层的调试器(source-level debugger)来跟踪程序执行情况)。


(3) 分段编译(separate compilation):C语言可以分别编译隔断程序。最后使用连接器(linker)把各段程序连接成一个完整的可执行程序。

优点:1. 有些编译器和编译环境不能一次完成编译的整个程序;

   2. 每一段程序创建并测试通过后,将其作为程序组块保存起来。将这样的程序块加入库(library)中,供其他程序使用;

   3. 由于各段程序是独立创建的,隐藏了其中的复杂性。 


2.1.3 编译过程(C/C++)

1. 对源代执行预处理:预处理器(preprocessor)用程序员定义好的模式来代替源代码中的模式。预处理可以节省输入,并增加代码可读性。将预处理后的代码存放在一个中间文件中;

2. 对预处理后的代码进行语法分析(第一遍编译):编译器将源码分解成小的单元并按照树形结构组织起来;

3. 使用全局优化器(global optimizer)生成更短更快的代码;(有时)

4. 由代码生成器(code generator)遍历语法分析树(第二遍编译,有时会使用窥孔优化器(peephole optimizer)从相邻代码中找出冗余代码):把树的每个节点转化成汇编语言或机器代码;

5. 通过汇编器对汇编语言汇编;(代码生成器生成汇编代码的情况下)

由4,5步生成目标模块(.o或.obj为扩展名的文件)

6. 连接器把一组目标模块连接成为一个可执行程序:连接器将处理模块中的引用问题,可以从连接的目标模块中搜索,亦可以从库中搜索,库由一个被称为库管理器(librarian)的程序来创建和维护;


(4) 在编译的第一遍中,进行类型检查(type checking)。检查函数参数是否正确使用。由于在编译时而非在运行时,所以称为静态类型检查(static type checking)。



2.2 分段编译工具


(5) 大项目中,需要把大程序构造成许多易于管理,可独立测试的小程序。C/C++中,子程序称为函数(function),调用时,通常要传给它一些参数(argumen),执行后可达到一个返回值(return value)或返回值为空。当一个文件中的函数要访问其他文件的函数或数据时,编译器需要知道这些函数和数据,特别是它的名字和基本用法,以确保能正确使用。告知编译器的过程叫做声明(declaration)。


2.2.1 声明与定义


1. 函数声明语法: 返回类型  函数名(参数类型 参数名, ......); 

int func1(int length, int width);

声明以分号结束,它告知编译器这只是一个声明;编译器会忽略参数名,它的作用仅在于帮助记忆。

假如a为整型,上述函数可以通过如下方式调用:

a = func1(2, 3);
在C++中,参数列表为空表示“不带参数的函数”,而在C中则表示为带任意参数的函数;

2. 函数定义语法: 返回类型  函数名(参数类型 参数名, ......){ }

int func1(int length, int width){ }
此时若存在参数的话必须要有函数名。


3. 变量声明:使用关键字extern声明一个变量但不定义;

extern int a;
关键字extern也可以声明函数,但这是多余的。

4. 使用头文件(header file)对库中的众多函数和变量做外部声明。扩展名为.h的文件。

使用#include预处理命令来包含头文件。该命令告诉预处理器打开指定头文件并在#include语句所在的地方插入头文件。

#include有两种方式来指定文件:尖括号(<>)(使用指定路径来寻找)或双引号(“”)(从当前目录开始寻找);


5. 标准C++ include格式:允许文件名长度超过8个字符,去除.h扩展名。对从C继承下来的.h扩展名的库仍然可用,同时也可以在文件名前加上字母“c”。如#include<stdio.h>,#include<cstdio>。


2.2.2 使用库文件


使用库必须:  1. 包含库的头文件;

2.使用库中的函数和变量;

3. 把库连接进可执行程序。


连接器的查找过程:

1. 当C/C++需要进行外部引用时,如若连接器尚未遇到这个函数或变量的定义,会把它的标识符加到“未解析的引用”列表中;

2. 连接器现在目标模块中查找,不能找到时会去查找库;

3. 通过库的索引进行查找,找到后将整个目标模块连接到可执行程序。


在创建一个C/C++可执行程序时,连接器会连接启动模块,以对程序进行初始化,建立堆栈并初始化某些变量。


连接器可以默认找到标准库中,因此只要添加头文件即可,但是如果使用附加库,需要将库文件名添加到由连接器处理的列表文件中。


 目前自己正在学习C++编程思想,写博客也是对自己学习过程进行一定的总结。如有错误,请指正。

阅读全文
0 0
原创粉丝点击