c++ primer —— 练习 14.2
2016-03-30 21:30
405 查看
//一个书店的应用程序
#include <string> #include <iostream> using namespace std; class Sales_data { friend std::istream& operator>>(std::istream&, Sales_data&); // input friend std::ostream& operator<<(std::ostream&, const Sales_data&); // output friend Sales_data operator+(const Sales_data&,const Sales_data&); // addition public: Sales_data(const std::string& s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(n * p) { } Sales_data() : Sales_data("", 0, 0.0f) {} Sales_data(const std::string& s) : Sales_data(s, 0, 0.0f) {} Sales_data(std::istream& is); Sales_data& operator+=(const Sales_data&); // compound-assignment std::string isbn() const { return bookNo; } private: inline double avg_price() const; std::string bookNo; //表示ISBN编号 unsigned units_sold = 0; //表示某本书的销量 double revenue = 0.0; //这本书的总销售收入 }; //(一)下面3个函数的声明可有可无,在VS2013上。(但是一些编译器允许尚无函数友元的声明的情况下就调用它。 //不过即使你的编译器支持这种行为,最好还是提供一个独立的函数声明。 //这样你更改了一个有这种强制声明的编译器,也不必改代码) //(二)友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明 //如果我们希望类的用户能够调用某个友元函数 //那么,我们就必须在友元声明之外在专门对函数进行一次声明 std::istream& operator>>(std::istream&, Sales_data&); std::ostream& operator<<(std::ostream&, const Sales_data&); Sales_data operator+(const Sales_data&, const Sales_data&); inline double Sales_data::avg_price() const { return units_sold ? revenue / units_sold : 0; } Sales_data::Sales_data(std::istream& is) : Sales_data() { is >> *this; } Sales_data& Sales_data::operator+=(const Sales_data& rhs) { units_sold += rhs.units_sold; revenue += rhs.revenue; return *this; } std::istream& operator>>(std::istream& is, Sales_data& item) { double price = 0.0; //书的价格 is >> item.bookNo >> item.units_sold >> price; if (is) item.revenue = price * item.units_sold; else item = Sales_data(); return is; } std::ostream& operator<<(std::ostream& os, const Sales_data& item) { os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price(); return os; } Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs) { Sales_data sum = lhs; sum += rhs; return sum; } int main() { Sales_data a, b; cin >> a >> b; a.operator+=(b); cout << a << endl; return 0; }
相关文章推荐
- 初学Qt之--在Qt中调用外部C语言模块
- C++作业2——【项目4】模拟ATM
- C++智能指针(1)
- 实验c++2-1
- C++作业2
- 寻找字符串中首次出现的不重复字符算法与c++实现
- 《纯C++写的贪吃蛇游戏》
- 【C++】《C++标准程序库》小结第十二章-数值
- C语言经典小程序(热门题型)
- Visual Studio环境变量使用实例:使用环境变量来组织工程
- C语言实现文件复制
- Accelerated C++:通过示例进行编程实践——习题解答(第0章 入门)
- 几种C++ 字符串分割的方法
- Accelerated C++:通过示例进行编程实践——习题解答(第1章)
- 【poj 1159】Palindrome 题意&题解&代码(C++)
- 关于C和c++中的文件结构
- c++函数重载
- LeetCode 22. Generate Parentheses
- c++使用心得
- C++组合应用之strtok字符串分割、数组平分算法、动态数组函数传参