C++Primer14.3.1节练习

练习14.13:

对于Sales_date类我们还可以定义相等运算符==,!=,减法/减等于运算符

#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);
	friend bool operator==(const Sales_date& s1, const Sales_date& s2);
	friend Sales_date operator-(const Sales_date& s1, Sales_date& s2);
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&);
	//减法
	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)
{
	Sales_date sum = h1;
	sum += h2;
	return sum;
}

//重载输入运算符
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;
}

//重载相等关系运算符
bool operator==(const Sales_date& s1, const Sales_date& s2)
{
	if (s1.isbn() == s2.isbn() && s1.units_sold == s2.units_sold && s1.revenue == s2.revenue)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//重载不等关系运算符
bool operator!=(const Sales_date& s1, const Sales_date& s2)
{
	//使用上面定义的==运算符来实现
	return !(s1 == s2);
}

//重载减法等于运算符
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& s1, Sales_date& s2)
{
	Sales_date dec = s1;
	dec -= s2;
	return dec;
}


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

练习14.14:

operator+的大部分代码实现与operator+=一样,operator+=会在operator+中被使用,相比于从头实现operator+,调用operator+=显然效率会更高

练习14.15:

略,与练习14.13类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白学C++.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值