1.2 C++程序设计语言
1.2.1 C++程序设计语言简介
C++语言是目前应用最为广泛的计算机程序设计语言之一。C++是由C语言扩充、改进而来的。C语言之所以要起名为C,是因为它主要参考B语言,C语言是B语言的进步,所以就起名为C语言。但是B语言并不是因为之前还有个A语言,而是B语言的设计者为了纪念其妻子,设计者妻子名字的第一个字母是B。当C语言发展到顶峰时,出现了一个版本叫C with Class,那就是C++最初的版本,在C语言中增加class关键字和类,那时有很多版本的C都希望在C语言中增加类的概念。后来C标准委员会决定为这个版本的C起个新的名字,在征集了很多名字后,最后以C语言中的++运算符来体现它是C语言的进步,故而叫C++,并成立了C++标准委员会。虽然C++是作为C语言的增强版出现的,就目前学习C++而言,它是一门独立的语言。读者可以完全不学C语言,而直接学习C++。
C++程序设计语言具有下列特点。
(1)C++完全兼容C,具有C语言的“简洁、紧凑、运算符丰富,可直接访问机器的物理地址,使用灵活方便,程序书写形式自由”等特点。大多数的C语言程序代码略做修改或不做修改就可在C++集成环境下运行。
(2)C++作为一种面向对象的程序设计语言,程序的各个模块间更具独立性,可读性更好,代码结构更加合理,设计和编制大型软件更为方便。
(3)用C++语言设计的程序可扩充性更强。
与其他高级程序设计语言一样,C++程序从开始编码到运行需要经过以下步骤。
(1)编辑源程序。可以在普通的文本编辑器(如Windows记事本)或一些专业开发软件(Dev C++、C-Free等)提供的编辑器中对程序进行编码。由高级语言编写的程序称为源程序。C++源程序默认的扩展名为.cpp。
(2)编译源程序。使用编译程序对源程序进行编译,目的是将高级语言编写的源程序翻译成计算机硬件可以识别的二进制机器指令。源程序经编译后生成扩展名为.obj的目标程序文件。
(3)链接目标程序。用链接器将编译成功的目标程序文件与相应的系统模块链接成扩展名为.exe的可执行程序。
1.2.2 简单的C++程序框架结构
下面通过一个简单程序来了解C++程序的构成。这个程序的功能只是告知计算机显示“Hello World”。
【例1-1】一个简单的C++程序示例。
/* ========================= C++程序示例 ========================= */ #include<iostream> //A,包含文件 using namespace std; //B,使用命名空间std int main() { //C,主函数 cout<<"Hello World "<<endl; return 0; }
结合上述程序示例,从以下几点粗略地介绍C++程序。
(1)程序注释。注释是程序员为程序所做的说明,是提高程序可读性的一种手段。注释并不是程序的必要部分,与其他高级语言一样,C++编译器在编译时将跳过注释语句,不对其进行处理。因此,无论源程序中有多少注释语句,均不会影响程序编译结果。
C++语言提供了两种程序注释方式:一种是界于符号“/*”和“*/”之间的内容均作为注释信息(如程序中的前三行),另一种是由符号“//”开始直至本行结束的全部内容(例如,程序中的A行、B行和C行)。
(2)文件包含。每个以符号“#”开始的行称为编译预处理指令。例1-1中的A行指令称为文件包含预处理指令。编译预处理是C++组织程序的工具。#include<iostream>的作用是在编译之前将文件iostream的内容插入程序中。iostream是系统提供的一个头文件,其中定义了C++程序输入/输出操作的有关信息,程序必须包含此文件才能进行输入/输出操作。
(3)命名空间。C++标准库中的类和函数是在std中声明的,如需要使用到其中的有关内容,就需要使用命名空间std编译。程序中的B行表示本程序使用系统提供的标准命名空间中的名称标识符。
(4)主函数。程序中的C行定义了一个函数,该函数描述程序的功能。main是函数名,其后紧跟一对圆括号。所有的C++程序有且只有一个main函数,通常称该函数为主函数。main函数是整个程序的入口,任何一个C++程序通常是从其主函数的第一条语句开始执行,执行完主函数的所有语句后,程序将自然结束。实现函数功能的语句序列必须用一对花括号括起来形成一个逻辑整体。
main前面的int表示该函数运行结束后将得到一个整数值,该整数值应该在函数执行结束前用return语句给出。在例1-1程序中,主函数最后一条语句表明,如果程序正常运行结束,将返回一个整数值0。main后的一对圆括号说明main函数运行所需的参数。例1-1中main函数后是一对空圆括号,说明本程序运行时无需提供参数。此时,也可以在圆括号中加void。
(5)信息输入/输出。在C++程序中,标准的输入/输出操作使用关键字cin或cout。
(6)程序语句。基本的C++功能语句都必须以分号结束。
(7)程序编写风格。从语法上讲,C++程序代码编写格式自由,甚至可以将多个语句写在同一行。但为了增加程序的可读性,建议在编写程序时遵守下列规则。
① 每行写一条语句,同一层次的代码左对齐。
② 配对的花括号中,上花括号“{”紧跟在上一行末尾,下花括号“}”单独另起一行,并且缩进层次同配对的上花括号“{”。花括号内的内容缩进在下一层次。
(8)源程序编译运行。编写完源程序后,将源程序文件存储为扩展名为.cpp的文件(如果在C++编译环境提供的编辑器中编辑源程序,则编译时自动存盘)。
编辑完源程序,还需要通过编译环境进行编译和链接后才能运行程序。上述示例程序运行后输出如下。
Hello World Press any key to continue. . .
程序执行结果在最后增加一行输出“Press any key to continue. . .”,这是系统自动添加的,目的是让用户看清屏幕输出内容,并提醒用户按任意键后程序将退出并返回到原编程环境。有些汉化的编译系统会以中文提示用户“按任意键继续. . .”。
通过上面的例子可以看出,一个简单的C++程序结构如下。
#include<iostream> using namespace std; int main(void) { …… return 0; }
读者只需要将上面框架结构中的“……”替换为自己需要的功能语句,就可以改写为自己的C++程序了。
需要特别提出的是,因为C++程序代码是大小写敏感的,所以在书写程序时要注意其大小写,如函数名main不能写成Main。同时,程序中语法部分不能出现中文字符(含标点符号)。
1.2.3 标准命名空间
命名空间(又称名字空间、名称空间或名域)的关键字为namespace。
在C++中,名称(标识符)可以是符号常量、变量、宏、函数、结构体、枚举类型、类和对象等。为了避免标识符的命名相互冲突,标准C++引入了命名空间来控制标识符的作用域,不同的命名空间中可以有同名的标识符而不相冲突。
标准C++库提供的标识符都放在标准命名空间std中,使用命名空间std有以下几种方法。
(1)利用using namespace声明所使用的命名空间。如例1-1所示,程序头部使用以下语句。
using namespace std;
这是最常用的一种声明命名空间的方法,它表明此后程序中的所有系统标识符如果没有特别说明,均来自命名空间std。
(2)用作用域运算符“::”标明标识符所属的命名空间。例如,例1-1程序代码可以改写成下列形式。
#include<iostream> int main(void) { std::cout<<"Hello World "<<std::endl; return 0; }
由于程序中没有用语句“using namespace std;”声明使用的命名空间,所以程序中使用的每一个系统标识符都必须用std::说明。例如,程序中的cout应改写为std::cout,endl应改写为std::endl。
(3)用using声明某个标识符的命名空间。例如,例1-1程序代码也可以改写成下列形式。
#include<iostream> using std::cout; //A using std::endl; //B int main(void) { cout<<"Hello World "<<endl; return 0; }
上述程序中A行和B行分别声明了标识符cout和endl的命名空间,表示程序中使用的标识符cout和endl均默认为来自命名空间std。
早期的C++标准不支持命名空间,因此程序中不需要声明使用的命名空间。C++早期的头文件都带扩展名“.h”,新版本为了与老版本兼容,也附带了这些头文件。如果用早期的头文件,例1-1也可以写成如下形式。
#include<iostream.h> int main(void) { cout<<"Hello World "<<endl; return 0; }
上述程序中使用了老版本带扩展名的头文件,因而不需要再声明命名空间。