《C++primer 第5版》习题集 练习2.42

本文所选的习题集题目可用于练习运算符重载!!!

题目:
1.输入书籍的销售信息(编号、售出数量、原始价格、实售价格、折扣),然后输出;
2.输入两条编号相同的书籍,输出汇总信息;

3.输入若干条编号相同的书籍,输出汇总信息

/*Sales_data.h*/
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
using namespace std;
class Sales_data
{
private:
	string bookNum;
	int saleNum = 0;
	float oriPrice=0.0;
	float salePrice=0.0;
	float discount=0.0;
public:
	Sales_data() = default;
	friend istream & operator >>(istream & in, Sales_data & data);//友元函数访问私有数据成员 重载运算符>>
	friend ostream & operator <<(ostream & out, Sales_data & data);//重载运算符<<
	Sales_data & operator += (Sales_data data);//非友元类内函数 重载运算符+=
	bool isbn(Sales_data data1, Sales_data data2) { return data1.bookNum == data2.bookNum; }//判断两条书籍信息是否相同
};
istream & operator >>(istream & in, Sales_data & data)
{
	in >> data.bookNum >> data.saleNum >>data.oriPrice >> data.salePrice >> data.discount;
	return in;
}
ostream & operator <<(ostream & out, Sales_data & data)
{
	out << "编号:" <<data.bookNum<<" 售出数量:" << data.saleNum << " 原始价格:" << data.oriPrice 
		<< " 实售价格:" << data.salePrice << " 折扣:" << data.discount << endl;
	return out;
}
Sales_data & Sales_data::operator += (Sales_data data)
{
	saleNum +=data.saleNum;
	salePrice = (salePrice*saleNum + data.salePrice*data.saleNum) / (saleNum + data.saleNum);
	discount = salePrice / oriPrice;
	return *this;
}
Sales_data & operator + (Sales_data & data1, Sales_data & data2)//非类内成员函数 重载运算符+
{
	Sales_data temp;
	data1.operator+=(data2);
	return data1;
}
bool compareISBN(Sales_data data1, Sales_data data2)
{
	Sales_data temp;
	return temp.isbn(data1,data2);
}
#endif
/*main.c*/
#include <iostream>
#include <string>
#include "Sales_data.h"

using namespace std;

const int questionFlag = 2;

int main(int argc, int **argv)
{
	Sales_data book;
	if (questionFlag == 1)
	{
		cout << "输入书籍的销售信息(编号、售出数量、原始价格、实售价格、折扣):" << endl;
		while (cin >> book)
			cout << book;
	}
	if (questionFlag == 2)
	{
		Sales_data book1, book2;
		cout << "输入两条书籍的销售信息(编号、售出数量、原始价格、实售价格、折扣):" << endl;
		cin >> book1 >> book2;
		if (compareISBN(book1, book2))
		{
			book = book1+book2;
			cout << book << endl;
		}
		else
			cout << "输入了不同的两条书籍销售信息" << endl;
	}
	if (questionFlag == 3)
	{
		Sales_data book1;
		cout << "输入n条相同书籍的销售信息(编号、售出数量、原始价格、实售价格、折扣):" << endl;
		if (cin >> book)
		{
			while (cin >> book1)
			{
				if (compareISBN(book, book1))
					//book = book + book1;
					book += book1;
				else
				{
					cout << "当前输入的书籍销售信息与之前不同!" << endl;
					break;
				}
			}
		}
		cout << "目前为止汇总的销售信息:" << endl;
		cout << book << endl;
	}
	return 0;
}

所用知识:

1. 友元函数

类的非成员函数不能直接访问类的私有数据成员,但友元函数可以,即它的访问权限与成员函数相同,但其不能用成员运算符来访问;

创建友元函数:将函数原型放入类声明中,并在原型前加入关键字friend;在类外定义不需要在函数名前指定类作用域运算符;

2. 函数重载或函数多态:使用户能够定义多个名称相同但特征标(参数列表)不同的函数;

将此概念继续应用在运算符上,可重载运算符;operator [ ] ()函数将重载[ ]运算符。


参考资料:

《C++primer 第五版》习题集 练习2.42



猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/79923185