C++细节 输出运算符的重载为什么不写成类的成员函数

 打印类中的一些变量,此时就需要使用函数或者重载,为了提高代码可读性,一般使用操作符重载来书写,而cout并不在c++的默认类成员函数中,需要我们自己书写。第一种写在类中如下面的代码(我们以日期类举例,较《c++primer》中的书店类更加容易讲解做笔记)

对输出运算符的重载

	void operator<<(ostream& out)
	{

			out << _year << "-" << _month << "-" << _day << endl;
	}

会出现一个问题,只能写成

d<<cout      //打印d中的年月日

 因为函数的第一个参数是this指针,第二个参数才是我们传进去的 out,但是这与std中的cout使用习惯完全不符,我们的所打印变量是应该在cout的右边,如  cout<<d<<endl.

这样的重载和普通的函数没有两样,也就失去了重载函数的目的所在。

那么这样,我们便不可以把输出运算符的重载写成成员函数,写成成员函数去实现功能,能实现功能 但失去重载本身的意义。

那么我们将输出运算符的重载

那么我们在类外写重载函数,此时输出运算符的重载函数是一个全局的。

void operator<<(ostream& out,const Date& d)
{

	out << d._year << "-" << d._month << "-" << d._day << endl;
}

然后在对应的类中使用友元


class Date
{
	friend  void operator<<(ostream& out, const Date& d);
public:

	Date(int year = 1998, int month = 1, int day = 1)
	/*	:_year(year)
		, _month(month)//初始化列表,
		, _day(day)
		*/
	{
		cout << "全缺省 " << endl;
		_year = year;//内置类型,       
		_month = month;
		_day = day;

	}
	Date(Date &d)//拷贝构造必须传引用,不然会无穷递归
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	void operator =(const Date&d)//赋值运算符重载  &是传引用
	{
		if(this != &d)//取地址
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;

		}
	}



	bool operator ==(const Date & d1)  //d1<d2  _____>   d1.operator (&d1,d2)
	{  
		return this->_year == d1._year&&\
			_month == d1._month&&\
			_day == d1._day;     
	}
	bool operator != (const Date &d)//d1!=d2    d1即this指针   *this就是d1
	{
		return!(*this == d);
	}
	bool operator < (const Date &d)
	{
	
	}
private:
	int _year;
	int _month;
	int _day;
};

猜你喜欢

转载自blog.csdn.net/weixin_41143631/article/details/81253701
今日推荐