C++primer 14.1节练习

练习14.1

重载运算符不保证操作数的求值顺序,例如对&&和||的重载版本不再具有“短路求值”的特性,两个操作数都要求值,而且不规定操作数的求值顺序。

相同点:

对于优先级和结合性级操作数的数目都不变。

练习14.2

 1 #include <iostream>
 2 #include <string>
 3 #include <memory>
 4 #include <vector>
 5 #include <algorithm>
 6 #include <numeric>
 7 
 8 using namespace std;
 9 
10 class Sales_data {
11     friend istream& operator >> (istream& is, Sales_data &s);
12     friend ostream& operator<<(ostream& os, Sales_data s);
13 public:
14     Sales_data() : bookNo("") {}
15     Sales_data(string s, unsigned us, double up) : bookNo(s), units_sold(us), units_price(up) {}
16     Sales_data operator+(const Sales_data& s);
17     Sales_data& operator+=(const Sales_data& s);
18 private:
19     string bookNo;
20     unsigned units_sold = 0;
21     double units_price = 0;
22 };
23 
24 istream& operator >> (istream& is, Sales_data &s);
25 ostream& operator<<(ostream& os, Sales_data s);
26 
27 int main()
28 {
29     Sales_data s1;
30     Sales_data s2("C++ primer", 10, 128.2);
31     cout << s2 << endl;
32     s1 = s2;
33     cout << s1 << endl;
34     cout << s1 + s2 << endl;
35     s1 += s2;
36     cout << s1 << endl;
37     cin >> s1;
38     cout << s1;
39     cout << s1 + s2 << endl;
40     system("pause");
41     return 0;
42 }
43 
44 istream & operator >> (istream & is, Sales_data &s)
45 {
46     is >> s.bookNo >> s.units_sold >> s.units_price;
47     return is;
48     // TODO: 在此处插入 return 语句
49 }
50 
51 ostream & operator<<(ostream & os, Sales_data s)
52 {
53     os << s.bookNo << " " << s.units_sold << " " << s.units_price;
54     return os;
55     // TODO: 在此处插入 return 语句
56 }
57 
58 Sales_data & Sales_data::operator+=(const Sales_data & s)
59 {
60     if (bookNo == s.bookNo)
61     {
62         units_sold = units_sold + s.units_sold;
63         return *this;
64     }
65     else
66     {
67         cout << "can not add" << endl;
68         return *this;
69     }
70     // TODO: 在此处插入 return 语句
71 }
72 
73 Sales_data Sales_data::operator+(const Sales_data & s)
74 {
75     if (bookNo == s.bookNo)
76     {
77         Sales_data ss;
78         ss.bookNo = bookNo;
79         ss.units_price = units_price;
80         ss.units_sold = units_sold + s.units_sold;
81         return ss;
82     }
83     else
84     {
85         cout << "error" << endl;
86         return *this;
87     }
88     // TODO: 在此处插入 return 语句
89 }

练习14.3

a)内置版本,比较两个指针类型

b)string版本

c)vector版本

d)书上多了一个双引号,去掉的话是string版本

练习14.4

(a) %通常定义为非成员。

(b) %=通常定义为类成员,因为它会改变对象的状态。

(c) ++通常定义为类成员,因为它会改变对象的状态。

(d) ->必须定义为类成员,否则编译报错

(e) <<通常定义为非成员

(f) && 通常定义为非成员。

(g) ==通常定义为非成员。

(h) ()必须定义为类成员,否则编译会报错。

练习14.5

类似第二题,参考第二题代码

 

posted @ 2017-09-07 21:10  五月份小姐  阅读(330)  评论(0)    收藏  举报