c++ primer 第十四章習題
阿新 • • 發佈:2018-11-08
c++ primer 第十四章習題
練習14.1 具體實現有區別 優先順序結合律和大致功能一樣
練習14.2
ostream& operator<<(std::ostream& os, const Sales_data& item){ os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price(); return os; } Sales_data& Sales_data::operator+=(const Sales_data& rhs){ this->combine(rhs); return *this; } Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs){ Sales_data sum = lhs; sum.combine(rhs); return sum; }
練習14.3(a) 都不是 (b)string © vector (d) string
練習14.4 (a) F (b) T © T (d) T (e) F (f) F (g) F (h) T
練習14.7
ostream& operator<<(ostream& os, const String& s) {
auto p = s.elements;
do {
os << *p;
}while(++p != s.end);
return os;
}
練習14.9
istream& operator>>(std::istream& in, Sales_data& item){ double price; in >> item.bookNo >> item.units_sold >> price; if(in) item.revenue = item.units_sold*price; else item = Sales_data(); return in; }
練習14.10 (a)正確輸入 (b)輸入錯誤返回預設初始化結果
練習14.11 沒有處理輸入錯誤的情況
練習14.13 沒有了
練習14.14 避免了一個臨時物件的計算
練習14.29 const版本的物件不可變而遞增遞減是要改變物件的。
練習14.31 使用合成版本的即可。
練習14.33 和函式的運算元一樣多
練習14.34
class judge
{
public:
judge()=default;
int operator()(bool a, int b, int c) {
return a?b:c;
}
};
練習14.35
class getString{ public: getString(istream& is):in(is){} string operator()() { string s; getline(in,s); if(in) return s; else return ""; } private: istream& in; };
練習14.37
class equals
{
public:
equals(int v):value(v){};
bool operator()(int k) {
return value == k;
}
private:
int value;
};
int main() {
vector<int> vi = {1,2,3,4,5,6,3,5,2};
replace_if(vi.begin(),vi.end(),equals(2),22222);
for(int x : vi)
cout << x<< ' ';
return 0;
}
練習14.43
class equals
{
public:
equals(int v):value(v){};
bool operator()(int k) {
return value == k;
}
private:
int value;
};
int main() {
vector<int> vi = {3,6,9};
auto r = find_if(vi.begin(),vi.end(),bind(modulus<int>(),54,placeholders::_1));
if(r == vi.end()) cout << "Yes"<<endl;
else cout << "No"<<endl;
return 0;
}
練習14.46 需要,可能會導致意料不到的計算結果。
練習14.47 第一個不正確 第二個正確
練習14.50 第一個存在二義性,因為有多個可行的轉換。第二個可行因為只有一個精準匹配的轉換。
練習14.51 第一個。因為內建轉換優先順序高。
練習14.52 第一個有二義性。第二個可以,使用的是LongDouble的。
練習14.53 不合法。double d = static_cast(s1)+3.14;