類的設計如下:
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無法輸出+後的結果