1. 程式人生 > >C++細節 輸出運算子的過載為什麼不寫成類的成員函式

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;
};