类的设计如下:
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无法输出+后的结果