C++ Primer系列 第1章 开始
学习一门新的程序设计语言的最好的方法就是练习编写程序。在本章中我们将编写一个程序来解决简单的书店问题。
我们的书店保存所有销售记录的档案,每条记录保存了某本书的一次销售的信息(一册或多册)。每条记录包含三个数据项:
0-201-70353-X
4
24.99
第一项是书的ISBN号(国际标准书号,一本书的唯一标识),第二项是售出的册数,最后一项是书的单价。有时,书店老板需要查询此档案,计算每本书的销售量,销售额及平均售价。
1.1 编写一个简单的C++程序
- 请注意,return语句末尾的分号。在C++中,大多数C++语言以分号表示结束。它们很容易被忽略,但如果忘记了写分号,就会导致莫名其妙的编译错误。
重要概念:类型
类型是程序设计最重要的概念之一,在本书中我们会反复遇到它。一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算。程序所处理的数据都保存在变量中,而每个变量都有自己的类型。如果一个名为v的变量类型为T,我们通常说”v具有类型T“,或等价的,”v是一个T类型变量“。
1.1.1 编译,运行程序
运行GNU或微软编译器
在不同操作和编译器系统中,运行C++编译器的命令也各不相同。最常用的编译器是GNU编译器和微软Visual Studio编译器。默认情况下,运行GNU编译器的命令是g++:$ g++ -o prog1 prog1.cc
此处,$是系统提示符。-o prog1是编译器参数,指定了可执行文件的文件名。
1.2 初识输入输出
C++语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制(以及很多其他设施)。对于很多用途,包括本书中的示例来说,我们只需了解IO库中一部分基本概念和操作。
本书中的很多示例都使用了iostream库。iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入IO设备的。术语”流“(stream)想要表达的是,随着时间的推移,字符是顺序生成或消耗的。
1.3 注释简介
注释界定符不能嵌套
界定限定符对形式的注释是以/开始,以/结束的。因此,一个注释不能嵌套在另一个注释之内。编译器对这类问题所给出的错误信息可能是难以理解,令人迷惑的。例如,在你的系统中编译下面的程序,就会产生错误:
/*
* 注释对/* */不能嵌套。
* "不能嵌套"几个字会被认为是源码,
* 像剩余程序一样处理
*/
int main()
{
return 0;
}
1.4 流程控制
程序设计语言提供了多种不同的控制流语句,允许我们写出更为复杂的执行路径。
1.4.1 while语句
while语句会反复执行一段代码,直至给定条件为假为止。
while (condition)
statement
1.4.2 for语句
for (int val = 1; val <= 10; ++val)
sum += val;
简要重述一下for循环的总体执行流程:
- 创建变量val,将其初始化为1;
- 检测val是否小于等于10。若检测成功,执行for循环体。若失败,退出循环,继续执行for循环体之后的第一条语句。
- 将val值增加1。
- 重复第2步中的条件检测,只要条件为真就继续执行剩余步骤。
1.4.3 读取数量不定的输入数据
从键盘输入文件结束符
当从键盘向程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。在Windows系统中,输入文件结束符的方法是敲Ctrl+Z(按住Ctrl键的同时按住Z键),然后按Enter或Return键。在UNIX系统中,包括Mac OS X系统中,文件结束符输入是用Ctrl+D。
1.4.4 if语句
- C++用=进行赋值,用== 作为相等运算符。两个运算符都可以出现在条件中。一个常见的错误是想在条件中使用 ==(相等判断),却误用了=。
1.5 类简介
在解决书店程序之前,我们还需要了解的唯一一个C++特性,就是如何定义一个数据结构来表示销售数据。在C++中,我们通过定义一个类(class)来定义自己的数据结构。
对于书店程序来说,我们假定类名为Sales_item,头文件Sales_item.h中已经定义了这个类。
1.5.1 Sales_item类
关键概念:类定义了行为
当你读写这些程序时,一件要牢记的是,类Sales_item的作者定义了类对象可以执行的所有动作。即Sales_item类定义了创建一个Sales_item对象时会发生什么事情,以及对Sales_item对象进行赋值,加法或输入输出运算时会发生什么事情。
1.5.2 初识成员函数
什么是成员函数?
这个if语句的检测条件
item1.isbn() == item2.isbn()
调用名为isbn的成员函数(member function)。成员函数是定义为类的一部分的函数,有时也被称为方法(method)。
1.6 书店程序
现在我们已经准备好完成书店程序了。我们需要从一个文件中读取销售记录,生成每本书的销售报告,显示售出册数,总销售额和平均售价。我们假定每个ISBN书号的所有销售记录在文件中是聚在一起保存的。
#include <iostream>
#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; // total现在表示下一本书的销售额
}
}
std::cout << total << std::endl; // 打印最后一本书的结果
} else {
// 没有输入! 警告读者
std::is_reference << "No data?!" << std::endl;
return -1; // 表示失败
}
return 0;
}
小结
本章介绍了足够多的C++语言的知识,以使你能够编译,运行简单的C++程序。我们看到了如何定义一个main函数,它是操作系统执行你的程序的调用入口。我们还看到了如何定义变量,如何进行输入输出,以及如何编写if,for和while语句。本章最后介绍了C++中最基础的特性——类。在本章中,我们看到了,对于其他人定义的一个类,我们应该如何创建,使用其对象。在后续章节中,我们将介绍如何定义自己的类。