1. 程式人生 > >c++ primer 第十四章習題

c++ primer 第十四章習題

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;