C++primer 7.2.1节练习

练习7,20

友元出现的情况是当其他类或者函数需要访问他的非公有成员时;利:可以让别的类或函数访问类的私有数据成员。弊:数据成员的安全性可能会降低。

练习7.21

使用了更多的函数来取得私有成员的值,保证原本程序的正常运行;

 1 #include <iostream>
 2 #include <string>
 3 #include "factmain.h"
 4 using namespace std;
 5 
 6 struct Sales_data {
 7     friend ostream &print(ostream &os, const Sales_data &item);
 8     friend istream &read(istream &is, Sales_data &item);
 9 private:
10     string bookNo;
11     unsigned units_sold;
12     double price = 0.0;
13     double revenue = 0.0;
14 public:
15     Sales_data() = default;
16     Sales_data(const string &s, const unsigned &u, const double &p) : bookNo(s), units_sold(u), price(p) {};
17     Sales_data(const string &s, const unsigned &u) : bookNo(s), units_sold(u) {};
18     Sales_data(istream &is);
19     string  isbn() const { return bookNo; }
20     unsigned &rUnit() { return units_sold; }
21     double &rPrice() { return price; }
22     double &rRevenue() { return revenue; }
23     Sales_data &combine(const Sales_data&);
24 };
25 
26 Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
27 ostream &print(ostream &os, const Sales_data &item);
28 istream &read(istream &is, Sales_data &item);
29 
30 
31 int main()                                                                            //main函数的部分需要改变
32 {
33     Sales_data test1("hello",56);
34     print(cout, test1);
35     Sales_data item1(cin);
36     Sales_data item2;
37     double totalRevenue = 0;
38     double totalSold = 0;
39     int counter = 1;
40     if ((item1.isbn()).empty())
41     {
42         item1.rRevenue() = item1.rPrice() * item1.rUnit();
43         while (read(cin,item2)) {
44             item2.rRevenue() = item2.rPrice() * item2.rUnit();
45             if (item1.isbn() == item2.isbn()) {
46                 item1.combine(item2);
47                 ++counter;
48             }
49             else {
50                 print(cout, item1) << endl;
51                 item1.isbn() = item2.isbn();
52                 item1.rUnit() = item2.rUnit();
53                 item1.rRevenue() = item2.rRevenue();
54                 counter = 1;
55             }
56         }
57         print(cout, item2) << endl;
58     }
59     system("pause");
60     return 0;
61 }
62 
63 Sales_data add(const Sales_data & lhs, const Sales_data & rhs) //非成员函数add
64 {
65     Sales_data sum = lhs;
66     sum.combine(rhs);
67     return sum;
68     // TODO: 在此处插入 return 语句
69 }
70 
71 istream & read(istream & is, Sales_data & item)
72 {
73     is >> item.bookNo >> item.units_sold >> item.price;
74     item.revenue = item.units_sold * item.price;
75     return is;
76     // TODO: 在此处插入 return 语句
77 }
78 
79 ostream & print(ostream & os, const Sales_data & item)
80 {
81     os << item.bookNo << " " << item.units_sold << " " << item.price << " " << item.revenue;
82     return os;
83     // TODO: 在此处插入 return 语句
84 }
85 
86 Sales_data & Sales_data::combine(const Sales_data &rhs)
87 {
88     units_sold += rhs.units_sold;
89     revenue += rhs.revenue;
90     return *this;
91 }
92 
93 Sales_data::Sales_data(istream & is)
94 {
95     read(is, *this);
96 }

练习7.22

见最终版本

posted @ 2017-08-06 10:08  五月份小姐  阅读(227)  评论(0编辑  收藏  举报