C++是一种编译型语言。为了让程序运行,首先要用编译器处理源代码文本,生成目标文件,然后再用连接器将目标文件组合成可执行程序。一个C++程序通常包含多个源代码文件,通常简称为源文件(source file)。
可执行程序都是为特定的硬件、系统组合创建的,不具可移植性。比如说,Mac上的可执行程序就无法移植到windows PC上。当谈论C++程序的可移植性时,通常是指源代码的可移植性,即源代码可以在不同系统上成功编译并运行。
ISO的C++标准定义了两类实体:
每个C++实现都提供标准库组件,它们其实也是非常普通的C++代码。换句话说,C++标准库可以用C++语言本身实现(仅在实现线程上下文切换这样的功能时才使用少量机器代码)。这意味着C++在面对大多数高要求的系统编程任务时既有丰富的表达力,同时也足够高效。
C++是一种静态类型语言,这意味着任何实体(如对象、值、名称和表达式)在使用时都必须已被编译器了解。对象的类型决定了能在该对象上执行的操作。
最小的C++程序如下所示:
int main(){} //最小的C++程序
这段代码定义了一个名为main的函数,该函数既不接受任何参数,也不做什么实际工作。
在C++中,花括号{ }表示成组的意思,上面的例子里,它指出函数体的首尾边界。从双斜线//开始直到该行结束是注释,注释只供人阅读和参考,编译器会直接略过注释。
每个C++程序必须有且只有一个名为main()的全局函数,它是程序执行的起点。如果main()返回一个int整数值,则它是程序返回给“系统”的值。如果main()不返回任何内容,则系统也会收到一个表示程序成功完成的值。main()返回非零值表示程序执行失败。并非每个操作系统和执行环境都会利用这个返回值:基于Linux/Unix的环境通常会用到,而基于Windows的环境很少会用到。
通常情况下,程序会产生一些输出。例如,下面这个程序输出 Hello, World!:
#include <iostream> int main() { std::cout<<”Hello, World!\n”; }
#include这一行指示编译器把iostream中涉及的标准流I/O设施的声明包含(include)进来。如果没有这些声明的话,表达式
std::cout<<”Hello, World!\n”;
无法正确执行。运算符<<(“输出”)把它的第二个参数写入到第一个参数。在这个例子里,字符串字面值“Hello, World!\n”被写入到标准输出流std::cout。字符串字面值是指被一对双引号包围的字符序列。在字符串字面常量中,反斜线\紧跟另一个字符组成一个“特殊字符”。在这个例子中,\n是换行符,因此最终输出结果是Hello, World!后跟一个换行。
std::指出名字cout可在标准库名字空间中找到。本书在讨论标准特性时通常会省略掉std::,3.4节将介绍不使用显示限定符而让名字空间中的名字可见。
基本上所有可执行代码都要放在函数中,并且被main()直接或间接地调用。例如:
#include <iostream> //包含(“引入”)I/O流库的声明 using namespace std; //使得std中的名字变得可见,而无须再使得std:: double square(double x) //计算一个双精度浮点数的平方 { return x*x; } void print_square(double x) { cout<<“the square of ”<<x<<“ is ”<<square(x)<<”\n”; } int main() { print_square(1.234); //打印:the square of 1.234 is 1.52276 }
“返回类型”void表示函数print_square()不返回任何值。