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
类似第二题,参考第二题代码
浙公网安备 33010602011771号