練習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 #include using namespace std;
string make_plural(size_t ctr, const string &word, const string &ending = "s")
int main()
第六章 6 2 5節練習 6 2 6節練習
練習6.25 編寫乙個main函式,令其接受兩個實參。把實參的內容鏈結成乙個string物件並輸出出來。解答 include include using namespace std int main int argc,char argv cout option endl 練習6.26 編寫乙個程式,...
第六章 6 6 1節練習 6 7節練習
練習6.52 已知有如下宣告,void manip int,int double dobj 請指出下列呼叫中每個型別轉換的等級 參見6.6.1節,第219頁 a manip a z b manip 55.4,dobj 解答 a 5 字元字面轉char 3 char轉int b 5 double轉in...
第六章 6 1 1節練習
練習6.6 說明形參 區域性變數以及區域性靜態變數的區別。編寫乙個函式,同時用到這三種形式。解答 只要定義有引數的函式,就會涉及到形參。區域性變數,就是只能在區域性使用的變數,無法在其他地方進行使用。當然,其還可以對全域性同名變數進行隱藏。區域性靜態變數,也是在區域性使用,但是其銷毀會在程式結束之後...