目录
前言
对于流插入和流提取运算符的讲解,还是利用日期类来辅助讲解
重载流插入运算符函数
对于内置类型,可以直接使用流插入进行打印
代码演示:
int i = 5;
double d = 2.3;
cout << i << endl;
cout << d << endl;
代码验证:
cout 和 << 流插入能自动识别类型,并打印
其实自动识别的底层逻辑是编译器自带的运算符函数重载
那么对日期类是否能直接打印呢?
可以看出 cout 并不能自动识别出 d1 的类型,所以会报错
通过了解知道了:
cout 是 ostream 头文件里面的对象,所以可以自己写一个流插入的重载函数
代码演示:
void operator<<(ostream& out)
{
out << _year << "年" << _month << "月" << _day << "日" << endl;
}
但是在使用的时候还是会报错,是因为在类中的成员函数,参数中有一个隐藏的 this 指针,且 this 指针默认是第一个参数,是不能改变的
所以导致了参数不匹配,那么只有反着调用才能成功调用
代码验证:
但是这样使用就会有不协调的感觉,就像是 cout 对象流向 d1 对象
所以不能写成成员函数,只能写成全局函数
代码演示:
void operator<<(ostream& out, Data& d)
{
out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
}
现在的参数匹配没有问题了,但是年月日是被访问限定符限定的,不能在类外面访问
这就要通过有元声明在类中声明以上函数,声明后才能正常使用
如何有元声明:
class Data
{
// 有元声明
friend void operator<<(ostream& out, Data& d);
public:
// 成员函数…………
private:
// 成员变量…………
};
代码验证:
可以看出,把类外函数在类中通过有元声明后,就能使用了
最后一个问题:
可能会出现连续流输入的情况
cout << d1 << d2;
那么以 void 形式返回就会出现问题,所以要更改返回值
且形参部分的日期类可以加上 const 修饰,因为只是打印,不会修改内容
代码演示:
ostream& operator<<(ostream& out, const Data& d)
{
out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
return out;
}
代码验证:
重载流提取运算符函数
代码演示:
istream& operator>>(istream& in, Data& d)
{
in >> d._year >> d._month >> d._day;
return in;
}
逻辑和重载流插入运算符函数是一样的,这里就不需要 const 修饰了,因为会改变日期类的内容
代码验证: