《C++ Primer》5th 課後練習 第六章 函數 41~50

練習 6.41 下面的哪個調用是非法的?爲什麼?哪個調用雖然合法但顯然與程序員的初衷不符?爲什麼?

char *init(int ht, int wd = 80, char bckgrnd = ' ');
(a) init();
(b) init(24,10);
(c) init(14,'*');
  • a) 非法,第一個參數沒有默認值,調用也未傳入值。
  • b) 合法。
  • c) 合法,參數的類型是int而調用者傳入char,顯然與調用者的初衷不符。

練習 6.42 給make_plural函數的第二個形參賦予默認實參’s’, 利用新版本的函數輸出單詞success和failure的單數和複數形式。

#include<iostream>
#include<string>
using namespace std;

string make_plural(size_t ctr, const string &word, const string &ending = "s") {
	return (ctr > 1) ? word + ending : word;
}

int main(int argc, char **argv)
{
	cout << make_plural(1, "success", "es") << endl;
	cout << make_plural(3, "success", "es") << endl;
	cout << make_plural(1, "failure") << endl;
	cout << make_plural(3, "failure") << endl;
	return 0;
}

練習 6.43 你會把下面的哪個聲明和定義放在頭文件中?哪個放在源文件中?爲什麼?

(a) inline bool eq(const BigInt&, const BigInt&) {...}
(b) void putValues(int *arr, int size);

全部放在頭文件中。

因爲第一個是內聯函數的聲明及定義,可以在程序中多次定義,而且要求定義一致,所以放在頭文件中保證一致。

第二個是普通函數的聲明,一般也放在頭文件中。

練習 6.44 將6.2.2節的isShorter函數改寫成內聯函數。

inline bool isShorter(const string &s1, const string &s2)
{
	return s1.size() < s2.size();
}

練習 6.45 回顧在前面的練習中你編寫的那些函數,它們應該是內聯函數嗎?如果是,將它們改寫成內聯函數;如果不是,說明原因。

一般內聯機制用於優化規模小、流程直接、頻繁調用的函數,我認爲函數體大概在行以內的函數,可以考慮加入內聯機制優化。

練習 6.46 能把isShorter函數定義成constexpr函數嗎?如果能,將它改寫成constxpre函數;如果不能,說明原因。

我認爲不能,因爲constexpr函數要求返回類型及所有形參類型都是字面值類型,這與isShorter的作用不符。

**練習 6.47 **

#include<iostream>
#include<string>
#include<vector>
using namespace std;
#define NDEBUG
void print_vec(vector<int> &vec, vector<int>::iterator p) {
#ifndef NDEBUG
	cout << "vector size is: " << vec.size() << endl;
#endif // !NDEBUG

	if (p != vec.end())
	{
		cout << *p << " " << endl;
		print_vec(vec, p + 1);
	}
	else {
		cout << endl;
		return;
	}
}
int main(int argc, char **argv)
{
	vector<int> ve{ 1,2,3,4,5,6,7,8 };
	print_vec(ve, ve.begin());
	return 0;
}

練習 6.48 說明下面這個循環的含義,它對assert的使用合理嗎?

string s;
while (cin >> s && s != sought) { } //空函數體
assert(cin);

從輸入中找到第一個等於sought的字符串

不合理,按其目的應該使用:

assert(s == sought);

練習 6.49 什麼是候選函數?什麼是可行函數?

  • 候選函數: 某次函數調用中對應的重載函數集中的函數。我認爲主要有兩個明顯特徵:1與被調函數重名 2在調用發生時可見。
  • 可行函數: 某次函數調用中,可以根據實參形成調用的函數。主要有兩個明顯特徵: 1形參數量與實參相同 2對應的形參與實參類型相同,或實參能轉換成形參的類型。

練習 6.50 已知有第217頁對函數 f 的聲明,對於下面的每一個調用列出可行函數。其中哪個函數是最佳匹配?如果調用不合法,是因爲沒有可匹配的函數還是因爲調用具有二義性?

(a) f(2.56, 42)
(b) f(42)
(c) f(42, 0)
(d) f(2.56, 3.14)
  • a) 不合法,void f(int,int)void f(double, double = 3.14)是可行函數,該調用具有二義性。
  • b) 合法,void f(int)是可行函數,最佳匹配爲void f(int)
  • c) 合法,void f(int,int)void f(double, double = 3.14)是可行函數,最佳匹配爲void f(int, int)
  • d) 合法,void f(int,int)void f(double, double = 3.14)是可行函數,最佳匹配爲void f(double, double = 3.14)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章