輸入和輸出重載操作符

類的設計如下:

class sales_item
{
public:
	friend istream& operator>>(istream&, sales_item&);
	friend ostream& operator<<(ostream&, const sales_item&);

	//explicit sales_item(void); // 防止隱式轉換
	sales_item(void) /*const*/;  //構造函數不能聲明爲const,默認構造函數
	~sales_item(void);

	sales_item(istream &is);//形參爲輸入流的構造函數
	sales_item(const string & book ); //const可以避免形參被修改,引用可以避免複製實參
	sales_item(const sales_item &org); //複製構造函數
	
	//int operator+(int, int); //error 不能對已有的操作符進行重定義
	//sales_item operator**(const sales_item &org); //error 不能通過連接其他合法操作符來創建任何新的操作符	
	//sales_item operator+(const int a, const int b); //error 必須至少提供一個類類型
	//sales_item operator+( const int b = 0 ); //error 不能有默認實參
	//sales_item operator+( const int b ); // ok 默認this爲類類型
	sales_item& operator=( const sales_item& );//賦值操作符
	ostream& operator<<( ostream& );  //這個返回值一定是流,會在判斷條件中判斷流的狀態

	string GetISBN() const { return isbn; }
	int GetUnitsSold() const { return units_sold; }
	double GetRevenue() const { return revenue; }
	inline double avg_price() const; //這裏聲明爲inline,定義處不必再聲明
	bool same_ishn(const sales_item & rhs) const;	
	
private:
	string isbn;
	int units_sold;
	double revenue;
};
//非成員函數重載運算符
istream& operator>>(istream&, sales_item&); //輸入
ostream& operator<<(ostream&, const sales_item&); //輸出

注意這裏一定要按照上節的要求設計重載操作符,這裏設計爲非類成員,因爲設計爲類成員的話,如下函數

//調用的時候,只能使用classObject << cout;
ostream& sales_item::operator<<(ostream& os)
{
	os << isbn;
	return os;
}
調用的時候必須是obj<<cout,這與我們默認使用方式不一樣的,因爲第一個形參已經默認爲this
非類成員的輸入輸出重載操作符的實現

//操作符 >>
istream& operator>>(istream& is, sales_item& s)
{
	double price;
	is >> s.isbn >> s.units_sold >> price;
	if (is)
	{
		s.revenue = s.units_sold*price;
	}
	else
	{
		s = sales_item();
	}
	return is;
}

//操作符 <<
ostream& operator<<(ostream& os, const sales_item& s)
{
	//先調用庫函數提供的<<,全部重定向到os流中
	os <<"ISBN\t" << "SoldNum\t" << "Revenue\t" << "AveragePrice" << endl;
	os << s.isbn << "\t" << s.units_sold << "\t" << s.revenue << "\t" << s.avg_price();
	return os;
}

這裏看輸出操作符,使用了兩個形參,第一個爲流就可以保證輸出的時候cout<<obj,這裏注意定義爲非成員函數,一定要將這兩個函數設爲類的友元函數,否則無法訪問類內有些成員變量或者函數。

調用測試:

	const string book = "1-23-45678";
	sales_item sales0;
	sales_item sales1("hello world");  
	sales_item sales2 = sales_item(); //定義

	sales1 << cout << endl; //類成員重載操作符
	cout << sales1 << endl; //非類成員重載操作符
#if 1
	if (!sales1.same_ishn(sales2))
	{
#if 0
		cout << sales1 + sales2 << endl;
#else
		cout << sales1.operator+(sales2) << endl;
#endif
	}
#endif
	
	cin >> sales0;
	cout << sales0 << endl;

這裏我們測試用例裏面還有成員輸出的測試,另外就是這裏使用了+,必須定義了,否則cout無法輸出+後的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章