本文所选的习题集题目可用于练习运算符重载!!!
题目:
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