C++Primer14.2.2节练习

练习14.9:

#include <iostream>
#include <string>
#include <errno.h>
using namespace std;

class Sales_date {
	//将非成员重载函数设置为友元函数
	friend Sales_date operator+(const Sales_date& h1, const Sales_date& h2);
	friend istream& operator >> (istream& is, Sales_date& item);
	friend ostream& operator << (ostream& os, const Sales_date& item);
public:
	//默认构造函数
	Sales_date():bookNo(std::string()){ }
	Sales_date(const std::string& s, unsigned us, double p):bookNo(s), units_sold(us), revenue(p*us) { }
	Sales_date(const std::string& s) :bookNo(s) { }
	//拷贝构造函数
	Sales_date(const Sales_date& s):bookNo(s.bookNo), units_sold(s.units_sold), revenue(s.revenue){ }
	//拷贝赋值运算符
	Sales_date& operator=(const Sales_date&);

	//复合赋值运算符
	Sales_date& operator+=(const Sales_date&);

	//得到bookNo
	std::string isbn()const { return bookNo; }

private:
	//平均售价
	double avg_price()const { return units_sold ? revenue / units_sold : 0; }
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

//拷贝赋值运算符
Sales_date& Sales_date::operator=(const Sales_date& s)
{
	bookNo = s.bookNo;
	units_sold = s.units_sold;
	revenue = s.revenue;

	return *this;
}

//复合赋值运算符
Sales_date& Sales_date::operator+=(const Sales_date& s)
{
	if (this->bookNo == s.bookNo)
	{
		units_sold = units_sold + s.units_sold;
		revenue = revenue + s.revenue;
		return *this;
	}
	else
	{
		throw runtime_error("bookNo is different");
	}
}

//重载的加法运算符
Sales_date operator+(const Sales_date& h1, const Sales_date& h2)
{
	if (h1.bookNo == h2.bookNo)
	{
		Sales_date sTemp = h1;
		sTemp.units_sold = sTemp.units_sold + h2.units_sold;
		sTemp.revenue = sTemp.revenue + h2.revenue;
		return sTemp;
	}
	else
	{
		//无法相加
		throw runtime_error("bookNo is different");
	}

}

//重载输入运算符
istream& operator >> (istream& is, Sales_date& item)
{
	double price;
	is >> item.bookNo >> item.units_sold >> price;
	//检查输入是否出错
	if (is)
	{
		item.revenue = item.units_sold * price;
	}
	else
	{
		cout << "input error" << endl;
		//输入失败,对象被赋予默认的状态
		item = Sales_date();
	}
	return is;
}

//重载输出运算符
ostream& operator << (ostream& os, const Sales_date& item)
{
	os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
	return os;
}


//测试
int main()
{
	Sales_date s1;
	cin >> s1;
	cout <<"经过重载的输入运算符得到的对象为:" << s1 << endl;
	system("pause");
	return 0;
}

结果:

练习14.10:

(a):程序正常执行,得到如下结果:

 (b):输入数据错误,对象的数据被置为默认值

 练习14.11:

这个重载运算符的实现没有考虑输入错误的情况,对于错误的输入也照样进行计算,得到的结果会与我们的预期有较大差别‘

对于(a),得到的结果还是一样

对于(b),部分数据被强制类型转换,且数据对应错误,结果也是错误的:

练习14.12:

略,类似练习14.9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学C++.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值