1语言的翻译过程
静态类型检查
类型检查(type checking)是编译器在第一遍中完成的。类型检查是检查函数参数是否正确使用,以防止许多程序设计错误。由于类型检查是在编译阶段而不是程序运行阶段进行的,所以称之为静态类型检查(static type checking)
2 分段编译工具
2.1声明与定义
2.1.2 对于带空参数表的函数,
在c语言中,声明
int func2();
表示“一个可带任意参数(任意数目,任意类型)的函数”。这就妨碍了类型检查。
而在C++语言中他就意味着“不带参数的函数”。
2.1.3 函数的定义
函数定义看起来像函数声明,但它还有函数体
2.1.4 变量声明的语法
对于变量的声明,C/C++需要一个关键字来说明“这只是一个声明,它的定义在别的地方”。这个关键字就是extern,它表示变量是在文件以外定义的,或在文件后面部分才定义。
对函数声明,因为没有函数体,编译器必定把它作为声明而不是函数定义。extern关键字对函数来说是多余的、可选的,函数定义时则要求要有标识符(这里指C语言,而C++不要求)。
2.1.5 包含头文件
#include有两种方式来制定文件:尖括号(<>)或双引号。
#include <header>
用尖括号来指定文件时,预处理器是以特定的方式来寻找文件,一般是环境中或编译器命令行指定的某种寻找路径。这种设置寻找路径的机制随机制随机器、操作系统、C++实现的不同而不同,要视具体情况而定。
#include “local.h”
用双引号时,预处理器以“定义实现的路径”来寻找文件。它通常是从当前目录开始寻找,如果文件没有找到,那么include 命令就按与尖括号同样的方式重新开始寻找。(ps:搜索的文件夹更多。如果不是自己创建的头文件,就尖括号了,嗯,是这个意思,要不影响速度)
2.1.6 标准C++ include 语句格式
标准使用的格式允许文件名长度可以大于众所周知的八个,去除了扩展名。
从C继承下来的带有传统”.h”扩展名的库仍然可用。然而,也可以使用更现代的C++风格使用它们,即在文件名前加一个字母”c”。这种方式提供了一个区分标志,说明所使用的C还是C++库。
#include <stdlib.h>
变成
#include <cstdlib>
2.3 使用库文件
当连接器在库中找到了定义后,就将整个目标模块儿不仅仅是函数定义连接到可执行程序(仅仅是库中包含所需定义的目标模块加入链接)。
用户使用与库函数同名的函数,把带有这种函数的文件插入到库文件名列表之前,就能用他自己的函数取代库函数。这可能是一个bug,并且C++名字空间禁止这样做。
连接器总是从标准库中查找程序中调用的经过编译的”标准”函数。
3编写第一个C++程序
3.2 名字空间
namespace关键字。
库或程序中的每一个C++定义集被封装在一个名字空间中,如果其他的定义有相同的名字,但它们在不同的名字空间,就不会产生冲突。
写程序之前,必须知道名字空间。如果只是简单地包含头文件,使用头文件中的一些函数或对象,编译时,可能会遇到一些奇怪的错误。虽然包含了头文件,但所有的声明都是在一个名字空间中,而没有告诉编译器我们想要用这个名字空间中的声明。
可以用一个关键字来声明:“我要私用这个名字空间中的声明和(或)定义”。这个关键字是”using”。所有的标准C++库都封装在一个名字空间中,即”std”(standard)。
#include <iostream.h>
相当于
#include <iostream>
using namespace std;
3.4 “Hello,World”
通过”<<”操作符把一系列的参数传递给cout对象。输入输出流参数endl表示一行结束并在行末加上一个换行符。C语言中,用双引号括起来的正文称为“字符串”(string),更精确的术语“字符数组”(character array).
在第一行以注释符(一般是”//”)跟一个冒号开始,而最后一行一“/:~”开始的注释,表示文件结束,这样的标记方便从代码文件中提取信息。
4关于输入输出流
4.1 字符数组的拼接
C预处理器可以进行字符数组的拼接(character array concatenation)。如果两个加进好的字符数组临街,并且他们之间没有标点,编译器就会把这些字符数组连接成单个字符数组。可用于代码列表行宽有限制时。
4.2 读取输入数据
用来完成标准输入功能的对象是cin(代表 “console input”,控制台输入)。Cin通常是指从控制台输入,但这种输入可以重定向来自其他输入源。
4.3 调用其他程序
system()函数在头文件<cstdlib>中声明。
5 字符串简介
字符数组,存放在内存中的一组字符,必须由程序员处理所有细节。
标准C++ string类就是设计用来处理(并隐藏)对字符数组的低级操作。
String类,包含在C++头文件<string>中,名字空间std,使用要用using 命令。
可以用”=”来给string对象赋值。连接string对象,只需用”+”操作符,”+”也可将string连接到字符数组中。如果想将string加到一个string或字符数组之后,可以用”+=”操作符完成这一操作。输入输出流知道如何处理string,可直接向cout发送string来打印它。
6 文件的读写
getline()包含在iostream库中,用它可以把一行读入到string对象中(换行符结束)。getline()的第一个参数是ifstream对象,从中读取内容,第二个参数是stream对象,返回值为bool类型。getline()逐行读取字符。
7 vector 简介
C++提供标准容器(container)类,容纳所有的各种对象。
vector类是一个模板(template),可有效地用于不同的类型。string的vector表示为vector<string>。为了在vector末尾后追加一个新元素,可以使用成员函数push_back()(对于一个具体的对象要用”.”号来调用它的成员函数)。
对vector操作符重载可取回添加的元素,使vector像数组那样使用。即各元素大小相同且逐个相邻的情况下由“下标”(indexing)选定。
创建可以存放不同类型的vector,只需把类型当做模板参数(即在尖括号中的参数)输入。vector可以通过使用方括号的下标操作符向vector的任何一个单元赋值。