第六章 6.4節練習 & 6.5.1節練習

練習6.39

說明在下面的每組聲明中第二條聲明語句是何含義。如果有非法的聲明,請指出來。

(a)

int calc(int, int);

int calc(const int, const int);

(b)

int get();

double get();

(c)

int *reset(int *);

double *reset(double*);

解答:

(a) 

第二條是計算兩個常量整型的數。

不合法,第二條無法和第一條進行區分。

(b) 

獲得double類型的get()

不合法,不能使用不同的返回值類型對函數進行重載。

(c) 

重置一個double類型的數。

合法。


練習6.40

下面的哪個聲明是錯誤的?爲什麼?

(a) int ff(int a, int b = 0, int c = 0);

(b) char *init(int ht = 24, int wd, char bckgrnd);

解答:

這兩個聲明都是合法的,但是第二個是不合理的。

第二個函數聲明的第一個參數使用了默認實參。

這會讓調用的時候有些理解上的問題,是向init傳兩個參數?還是三個參數?

如書中所說,沒有提供實參的話,默認實參纔會使用到,所以這裏還是需要傳遞三個參數的,

否則程序無法編譯通過。


練習6.41

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

char *init(int ht, int wd = 80, char bckgrnd = ' ');

(a) init();

(b) init(24, 10);

(c) init (14, '*');

解答:

(a)調用是非法的。這裏init函數至少需要傳遞進去一個參數,而這個調用沒有傳遞參數,ht參數沒有得到實參,必然會出現編譯錯誤。

(c)是合法的,但是與初衷不符。這裏應該是想將ht置爲14, bckgrnd置爲‘*’。而結果是,ht爲14,wd爲‘*’的ASCII碼值,bckgrnd還是‘ ’


練習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(){
	string str1 = "success", str2 = "failure";
	cout << make_plural(1, str1, "es") << endl;
	cout << make_plural(2, str1, "es") << endl;
	cout << make_plural(1, str2) << endl;
	cout << make_plural(2, str2) << endl;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章