浅谈 C++输入输出流及其重载
在学习 C
阶段我们写代码第一句就是#include<stdio.h>
,这个到底是什么呢?
include
称为文件包含命令,stdio
为 standard input output
的缩写,意为“标准输入输出”,是一个库,同样在 C++
中也存在这样一个标准输入输出库#include
,我们称之为标准输入输出流类库。
输入是将数据从输入设备传送到主机内存的过程,输出则是将数据从主机内存传送到输出设备的过程。数据像流水一样在主机和外存设备之间流动,我们形象称之为流。
重载输入/输出运算符
学习完 C 语言后,相信大家和我感受一样就是 C
语言语法要求很严格,用的时候规定很多。比如 scanf
和 printf
这两个函数在使用的时候如果我们制定的数据类型和输入的数据类型不一致的时候,就会出现很多错误。
但是我们在使用 C++
的时候,我们不需要关心指定的输入数据类型,这得益于在 C++
的(I/O stream)中,对于>>
和<<
这两个运算符进行了重载。
重载机制是 C++
相对于 C
的很大一个改进,我们不需要想不同的名字来实现类似功能,并且我们可以通过重载>>
和<<
实现用户自定义的输入输出。
我们来看一段代码
class Date
{
private:
int month;
int day;
int year;
public:
Date(int m = 1,int d = 20,int y = 2020)//构造函数
{
month = m;
day = d;
year = y;
}
};
我们创建了个日期类,如果我们现在想直接打印出来这个类的成员这是做不到的。
Date dt(4,22,2020);
cout << dt;
但是我们如果对<<
进行了重载就可以
friend ostream &operator<<(ostream& os, Date date);
ostream &operator<<(ostream& os, Date date)
{
os << "date.month:"<<date.month << "date.day"<<date.day << "date.year"<<date.year;
return os;
}
为什么重载为这个类的友元函数?因为运算符<<左边的操作数不是 Date 类型的的对象,是一个流。
重载之后我们就可以直接 cout << dt;
再来看>>
的重载
friend istream &operator>>(istream &in, Date &dt);
istream &operator>>(istream &in, Date &date)
{
cout << "day month year" << endl;
in >> date.day >> date.month >> date.year;
}
这样我们就能直接输入输出对象了
Date dt;//创建对象
cin >> dt;
cout << dt << endl;
这样我们就完成了这个 Date
类的输入输出重载,通过重载机制,我们可以大量减少代码量并且方便许多,聪明的你是否学会了呢?