每个C++程序都包含一个或多个函数,其中一个必须命名为main。操作系统通过调用main来运行C++程序。
// main函数的返回类型必须为int
int main()
{
return 0;
// 在大多数系统中,main的返回值被用来指示状态。返回值0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型
}
一个函数的定义包含四部分:
(1)返回类型
(2)函数名
(3)一个括号包围的形参列表(允许为空)
(4)函数体:以左花括号开始,以右花括号结束的语句块
源文件后缀:.cc、.cxx、.cpp、.cp、.C
// CC是编译器程序的名字,$是系统提示符
$ CC prog1.cc
// 编译器生成一个可执行文件,Windows系统将可执行文件命名为prog1.exe,UNIX系统将可执行文件命名为a.out
// 在Windows系统中运行可执行文件
$ prog1 // 可忽略扩展名.exe
$ .\prog1 // "."后跟一个反斜线指出文件在当前目录中
// 在UNIX系统中运行可执行文件
$ a.out
$ ./a.out // "."后跟一个斜线来指出可执行文件位于当前目录中
// 访问main的返回值的方法依赖于系统
// 在UNIX和Windows系统中,执行完一个程序后,都可以通过echo命令获得其返回值
$ echo $? // UNIX
$ echo %ERRORLEVEL% // Windows
// 运行GNU编译器的命令是g++
$ g++ -o prog1 prog1.cc
// $是系统提示符
// -o prog1是编译器参数,指定了可执行文件的文件名。
// 在不同的操作系统中,此命令生成一个名为prog1(UNIX)或prog1.exe(Windows)的可执行文件
// 如果省略了-o prog1参数,在UNIX系统中编译器会生成一个名为a.out的可执行文件,在Windows系统中会生成一个名为a.exe的可执行文件
// 根据使用的GNU编译器的版本,可能需要指定-std=c++0x参数打开对C++11的支持
// 运行微软Visual Studio编译器的命令为c1
C:\Users\me\Programs> c1 /EHsc prog1.cpp
// C:\Users\me\Programs>是系统提示符,Users\me\Programs是当前目录名
// 命令c1调用编译器,/EHsc是编译器选项,用来打开标准异常处理
// 微软编译器会自动生成一个可执行文件prog1.exe
// 编译器通常都包含一些选项,能对有问题的程序结构发出警告。
// GNU编译器使用-Wall选项
// 微软编译器使用/W4
Windows 7操作系统并不处理或报告程序返回的错误标识,直观上,返回-1的程序与返回0的程序在执行效果上并无不同。但环境变量ERRORLEVEL记录了上一个程序的返回值。因此,在控制台窗口执行修改后的程序,接着执行echo %ERRORLEVEL%,会输出-1。在Linux系统中,执行echo $?有类似效果。
iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。
1、标准输入:cin(istream类型对象)
2、标准输出:cout(ostream类型对象)
3、标准错误:cerr(ostream类型对象),输出警告和错误消息。默认情况下,写到cerr的数据是不缓冲的。
4、clog(ostream类型对象),输出程序运行时的一般性信息。默认情况下,写到clog的数据是被缓冲的。
系统通常将程序所运行的窗口与这些对象关联起来。当我们读取cin,数据将从程序正在运行的窗口读入,当我们向cout、cerr和clog写入数据时,将会写到同一个窗口。
#include
int main()
{
// <<输出运算符:左侧必须是ostream对象,右侧是要打印的值
// 此运算符将给定的值写到给定的ostream对象中,输出运算符的计算结果就是其左侧运算对象
// 前缀std::指出名字cout和endl是定义在名为std的命名空间中的
std::cout << "Enter two numbers:" << std::endl;
// 写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流
int v1 = 0, v2 = 0;
// >>输入运算符:左侧必须是istream对象,右侧为给定对象
// 从给定的istream读入数据,并存到给定对象中,输入运算符返回其左侧运算对象作为其计算结果
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;
return 0;
}
在C++中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。
标准库定义的所有名字都在命名空间std中。
1、单行注释:以双斜线(//)开始,以换行符结束。
2、界定符对注释:以 /* 开始,以 */ 结束。当注释界定符跨越多行时,最好能显式指出其内部的程序行都属于多行注释的一部分,注释行的每行都以一个星号开头。
我们通常需要在调试期间注释掉一些代码。由于这些代码可能包含界定符对形式的注释,因此可能导致注释嵌套错误,因此最好的方式是用单行注释方式注释掉代码段的每一行。
// while语句反复执行一段代码,直至给定条件为假为止
// 求1到10这10个数之和
#include
int main()
{
int sum = 0, val = 1;
while (val <= 10) {
sum += val;
++val;
}
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
#include
int main()
{
int sum = 0;
// 每个for语句都包含两部分:循环头和循环体
// 循环头控制循环体的执行次数,它由三部分组成:初始化语句、循环条件、表达式
for (int val = 1; val <= 10; ++val) {
sum += val;
}
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
for循环与while循环对比:
在循环次数已知的情况下,for循环的形式更为简洁。
在循环次数无法预知时,用while循环实现更适合。用特定条件控制循环是否执行,循环体中执行的语句可能导致循环判定条件发生变化。
#include
int main()
{
int sum = 0, value = 0;
// while循环条件实际上检测的是std::cin
// 当我们使用一个istream对象作为条件时,其效果是检测流的状态。
// 如果流是有效的,即流未遇到错误,那么检测成功
// 当遇到文件结束符,或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态变为无效。处于无效状态的istream对象会使条件变为假
while (std::cin >> value) {
sum += value;
}
std::cout << "Sum is " << sum << std::endl;
return 0;
}
当从键盘向程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。在Windows系统中,输入文件结束符的方法是敲Ctrl+Z,然后按Enter或Return键。在UNIX系统中,包括Mac OS X系统中,文件结束符输入时用Ctrl+D。
#include
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal) {
int cnt = 1;
while (std::cin >> val) {
if (val == currVal) {
++cnt;
} else {
std::cout << currVal << " occurs " << cnt << " times" << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs " << cnt << " times " << std::endl;
}
return 0;
}
头文件后缀:.h、.H、.hpp、.hxx。标准库头文件不带后缀。
类Sales_item的作者定义了类对象可以执行的所有动作。
#include
#include "Sales_item.h"
// 用尖括号(<>)包围标准库头文件,用双引号("")包围不属于标准库的头文件
int main()
{
Sales_item book;
std::cin >> book;
std::cout << book << std::endl;
return 0;
}
#include
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
std::cin >> item1 >> item2;
std::cout << item1 + item2 << std::endl;
return 0;
}
使用文件重定向:允许我们将标准输入和标准输出与命名文件关联起来
$ addItems outfile
假定$是操作系统提示符,我们的加法程序已经编译为名为addItems.exe的可执行文件,则上述命令会从一个名为infile的文件读取销售记录,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录
#include
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
std::cin >> item1 >> item2;
if (item1.isbn() == item2.isbn()) {
std::cout << item1 + item2 << std::endl;
return 0; // 表示成功
} else {
std::cerr << "Data must refer to same ISBN" << std::endl;
return -1; // 表示失败
}
}
成员函数是定义为类的一部分的函数,有时也被称为方法。
#include
#include "Sales_item.h"
int main()
{
Sales_item total;
if (std::cin >> total) {
Sales_item trans;
while (std::cin >> trans) {
if (total.isbn() == trans.isbn()) {
total += trans;
} else {
std::cout << total << std::endl;
total = trans;
}
}
std::cout << total << std::endl;
} else {
std::cerr << "No data?!" << std::endl;
return -1;
}
return 0;
}
本章介绍了足够多的C++语言的知识,以使你能够编译、运行简单的C++程序。我们看到了如何定义一个main函数,它是操作系统执行你的程序的调用入口。我们还看到了如何定义变量,如何进行输入输出,以及编写if、for和while语句。本章最后介绍了C++中最基本的特性——类。在本章中,我们看到了,对于其他人定义的一个类,我们应该如何创建、使用其对象。在后续章节中,我们将介绍如何定义自己的类。
1、缓冲区:一个存储区域,用于保存数据。IO设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。我们可以显示地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。默认情况下,读cin会刷新cout;程序非正常终止时也会刷新cout。
2、表达式:最小的计算单元。表达式求值会产生一个结果。
3、操纵符对象:如std::endl,在读写流的时候用来“操纵”流本身。