練習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;
}