C++ ——— 重载流插入和流提取运算符函数以及有元声明

目录

前言

重载流插入运算符函数

重载流提取运算符函数


前言

对于流插入和流提取运算符的讲解,还是利用日期类来辅助讲解

C++ ——— 完善日期类-优快云博客


重载流插入运算符函数

对于内置类型,可以直接使用流插入进行打印

代码演示:

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 修饰了,因为会改变日期类的内容

代码验证:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值