第一章
初始输入输出
iostream
库包含两个基础类型istream
和ostream
,分别表示输入流和输出流。一个流就是一个字符序列,从IO设备读出或写入IO设备的。术语“流”想表达的是,随着时间的推移,字符是顺序生成消耗的。
一个使用IO库的程序:
#include<iostream>
int main()
{
std::cout<<"Enter two numbers:"<<std::endl;
int v1 = 0, v2 = 0;
std::cin>>v1>>v2;
std::cout<<"The sum of "<<v1<<" and "<<v2<<" is "<<v1 + v2
<<std::endl;
return 0;
}
向流写入数据
std::cout<<"Enter two numbers:"<<std::endl;
<<
为输出运算符,接受两个运算对象,左侧的运算对象必须是一个ostream
对象,右侧的运算对象是要打印的值。此运算符将给定的值写到给定的ostream
对象中。输出运算符的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个ostream
对象。
endl
是一个被称为操纵符的特殊值。写入endl
的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流
注意:程序员常常在调试时添加打印语句。这类语句应该保证“一直”刷新流,否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误判断。
使用标准库中的名字
为什么要在cout
和cin
前面加上std::
呢?
前缀std::
指出名字cout
和endl
是定义在名为 std
的**命名空间(namespace
)**中的。命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间std
中。
通过命名空间使用标准库有一个副作用:当使用标准库的一个名字时,必须显示说明我们想使用来自命名空间std
中的名字。例如,需要写出std::cout
,通过使用**作用域运算符(::)**来指出我们想要使用定义在命名空间std
中的名字cout
。
从流读取数据
std::cin>>v1>>v2;
**输入运算符(>>)**与输出运算符类似,它接受一个istream
作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的istream
读入数据,并存入给定对象中。与输出运算符类似,输入运算符返回左侧运算对象作为其运算结果。
控制流
读取数量不定的输入数据
#include<iostream>
int main()
{
int val = 0;
int sum = 0;
while(std :: cin >> val)
{
sum += val;
}
std :: cout << "The sum is " << sum << std :: endl;
return 0;
}
std :: cin >> val
,此表达式从标准输入流读取下一个数,保存在val
中。输入运算符返回其左侧运算对象,也就是std :: cin
,因此,此while
语句循环条件实际上检测的是std :: cin
。
当我们使用一个istream
对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到**文件结束符(end-of-file)**或遇到一个无效输入时(例如读入的数不是一个整数),istream
对象的状态会变为无效。处于无效状态的istream
会使条件变为假。
在windows系统中,输入文件结束符的方法是敲 Ctrl + Z
,然后按 Enter 或 Return 键。在 UNIX 系统中,包括Mac OS X系统中,文件结束符输入是用Ctrl + D
。
常见编译错误
-
语法错误
如在一个语句后漏加分号,或者漏掉了引号
-
类型错误
如向一个期望参数为 int 的函数传递了一个字符串字面值常量
-
声明错误
常见的两种声明错误为:对来自标准库的名字忘记使用
std ::
或者标识符名字拼写错误、
类简介
在C++中,我们通过定义一个类(class)来定义自己的数据结构。一个类定义了一个类型,以及与其关联的一组操作。
为了使用类,我们需要了解的三件事情
- 类名是什么?
- 它在哪里定义的?
- 它支持什么操作?
对于书店程序来说,我们假定类名为Sales_item
,头文件Sales_item.h
中华已经定义了这个类。
如前所见,为了使用标准库设施,我们必须包含相关的头文件。类似的,我们也需要使用头文件来访问自己的应用程序所定义的类。习惯上,头文件根据其中定义的类的名字来命名。我们通常使用 .h
作为头文件的后缀,但也有一些程序员习惯 .h
、.hpp
或.hxx
。标准库头文件通常不带后缀。编译器一般不关心头文件命名的形式,但有的IDE对此有特定要求。
对于不属于标准库的头文件,用双引号(" ")包围,而来自标准库的头文件,用尖括号(< >)包围头文件名。
Sales_item 类
Sales_item类的作用是表示一本书的总销售额、售出册数和平均售价。现在我们现在不关心这些数据如何存储、如何计算。为了使用一个类,我们不必关心它是如和实现的,只需要知道类对象可以执行什么操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t3nVA5nT-1662275899924)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220903202933962.png)]
初识成员函数
成员函数是定义为类的一部分的函数,有时也被称为方法。
item.isbn()
:调用名为item的对象的成员函数isbn
,此函数返回item
中保存的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;
}
}
std :: cout << total << std :: endl; //打印最后一本书的结果
}
return 0;
}