练习14.1
重载运算符不保证操作数的求值顺序,例如对&&和||的重载版本不再具有“短路求值”的特性,两个操作数都要求值,而且不规定操作数的求值顺序。
相同点:
对于优先级和结合性级操作数的数目都不变。
练习14.2
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 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 else66 {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 else84 {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
类似第二题,参考第二题代码