输入和输出重载操作符

类的设计如下:

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无法输出+后的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值