首先介绍一个简单的C++程序,该程序仅输出消息:

  1. #include <iostream> //预处理
  2. int main() //函数头
  3. { //开始函数体
  4. using namespace std; //使定义可见
  5. cout << "Come up and C++ me some time."; //消息
  6. cout << endl; //开始新行
  7. cout << "You won't regret it!" << endl; //更多输出
  8. return 0; //结束函数体
  9. }

下面将详细介绍以上代码。

2.1.1 main()函数

基本结构如下:

  1. int main()
  2. {
  3. //语句
  4. return 0;
  5. }

以上代码定义了一个main()函数,并描述了该函数的行为。第一行叫函数头(function heading),花括号中的叫函数体,最后一条语句叫返回语句(return statement)。

语句和分号 编译器需要知道一条语句何时结束,C++使用分号作为终止符(terminator)。

  1. 作为接口的函数头

C++要求 main() 的定义以 int main() 开始。编译器会将一些启动代码添加到程序中,这段代码是程序和操作系统之间的桥梁,而启动代码就会调用 main()。

  1. 为什么 main() 不能使用其他名称

如果没有 main(),编译器会发出警告。如果编写lib模块,则不需要。

2.1.2 C++注释

C++注释以 // 开始,C注释用 //,两者都可以用。

  1. //这是C++风格注释
  2. /* 这是C风格注释 */

2.1.3 预处理器和 iostream 文件

以下代码使用了C++输入输出工具:

  1. #include <iostream>
  2. using namespace std;

第一行编译指令会令预处理器将 iostream 文件的内容添加到程序中,这是典型的预处理操作。实际上,iostream 文件的内容会取代 #include 代码行,原始文件没有被修改,而是与 iostream 组合成一个复合文件。

2.1.4 头文件名

C头文件使用 .h 扩展名,C++头文件没有扩展名,例如,math.h 这种C头文件。有些C头文件会转换为C++头文件,去掉h扩展名并加上c前缀,如C++版本的 math.h 转换为 cmath。

下表是头文件命名约定:

头文件类型 约定 示例 说明
C风格(旧) 以 .h 结尾 math.h C、C++可用
C++风格(旧) 以 .h 结尾 iostream.h C++可用
C++风格(新) 没有扩展名 iostream C++可用,可以使用 namespace std
转换后的C 没有扩展名,加c前缀 cmath C++可用,可以使用 namespace std

2.1.5 命名空间

名称空间支持是一项C++特性。使用C++风格的头文件就可以使用 using namespace std; 名称空间编译指令了。

在大型项目中,通常使用所需的名称更好,而不是使用 using namespace std:

  1. using std::cout;
  2. using std::endl;
  3. using std::cin;

本书后面将采用其他名称空间管理技术。

2.1.6 使用 cout 输出

代码:

  1. cout << "Come up and C++ me some time.";

双引号括起来的是字符串。<<符号表示将字符串发送给 cout,该符号指出了信息流动的路径。与其说程序显示了一条消息,不如说它将一个字符串插入到了输出流中。

初识运算符重载 通过重载,一个运算符可以有多种含义,编译器可以根据上下文来确定其含义。例如,<<表示插入运算符、左移运算符,&表示地址运算符、按位AND运算符,*表示乘法、解除引用。C++扩展了运算符重载概念,允许用户定义的类型(类)重新定义运算符的含义。

  1. 控制符 endl

在输出流中插入 endl 会导致屏幕光标换行,这种特殊符号被称为控制符(manipulator)。

  1. 换行符

C++也可以使用C的换行 \n,这被称为“转义序列”。与 endl 的区别是:endl 运行前会刷新输出立即显示,而 \n 不能保证立马输出。

2.1.7 C++代码格式化

以下代码虽然合法,但不好看:

  1. #include <iostream>
  2. int
  3. main
  4. () {
  5. //...
  6. return 0;
  7. }

C++11新增的原始字符串(raw)可以包含回车,将在第4章讨论。