C++入门-----运算符重载(2)

学习目标

    • 1. 流插入、流提取运算符的概念
      • 1.1 特点
    • 2. 以流提取为例

1. 流插入、流提取运算符的概念

输入与输出是以内存为参照物。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作;如果字节流是从内存流向设备(如显示展打印机等),这叫做输出操作。

流提取运算符cout:cout是一个全局的、ostream类型的对象,链接到标准输出设备,通常是显示屏,cout是流提取运算符<<;

流插入运算符cin:与cout同理,但是其链接的是标准输入设备,通常是键盘,cin是流插入运算符>>。

1.1 特点

  • 只对内置类型起作用

观察下列代码:

class Date
{
public:
Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2000,1,1);
	cout << d1 << endl;//错误
return 0;
}

2. 以流提取为例

  • 疑问

如何输出d1对象里的成员数据?

下面这句代码是非法的。

//d1是Date类型
cout<<d1;

因为d1属于自定义类型,cout里并没有能接收Date类型的操作数。

在c++中,流插入(>>)、流提取(<<)运算符都只能对内置类型产生作用,自定义类型不可以。因为其ostream类里只封装了系统认识的内置类型。
(如布尔类型,长、短整型,浮点型等)

C++入门-----运算符重载(2)_第1张图片

为了解决这个问题,就把这两个运算符进行重载,与普通运算符重载一样,格式分别为:

//两个形参,一个是this指针一个是out
//this指针指向d1
//_cout接收cout
void operator<<(ostream& _cout)

但是重载了以后再调用发现还是不行

cout<<d1;//无法输出

但是调用其函数就可以

d1.operator<<(cout);//成功输出
  • 原因

运算符重载里面,如果是双操作数,第一个操作数是左操作数,第二个操作数是右操作数。 this指针抢占了一个位置,所以只要把顺序调转即可输出:

d1<<cout;//输出成功

但是这不符合我们的习惯,所以重载成成员函数,并不符合习惯而且不适于表达“流提取”的概念。

于是我们把它定义成全局函数:

void operator<<(ostream& _cout,const Date& d)

但是此时又无法访问到Date类里面的成员,所以要用到友元函数。

class Date
{
   friend void operator<<(ostream& _cout,const Date& d);
public:
//内容略
}

如果要求连续输出(cout<

ostream& operator<<(ostream& _cout, const Date& d)
  • 流插入

流插入也同理,但是其第二个参数不能为const,因为要改变对象的成员数据。

friend void operator>>(ostream& _cin,Date& d);
istream& operator>>(istream& _cin, Date& d)
  • 全部代码
class Date
{
	friend ostream& operator<<(ostream& _cout,const Date& d1);
	friend istream& operator>>(istream& _cin,Date& d1);
public:
	//构造函数
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
//流提取
//定义成全局
ostream& operator<<(ostream& _cout, const Date& d)
{
	_cout << d._year << "-" << d._month << "-" << d._day;
	return _cout;
}
//流插入
istream& operator>>(istream& _cin, Date& d)
{
	_cin >> d._year;
	_cin >> d._month;
	_cin >> d._day;
	return _cin;
}
int main()
{
	Date d1(2000, 1, 1);
	cout << d1 << endl;
	cin >> d1;
	cout << d1 << endl;
	return 0;
}

你可能感兴趣的:(C++,c++,算法,开发语言)