6.16:下面這個函式雖然合法,但是不算特別有用。指出它的侷限性並設法改善。
bool is_empty(string& s) { return s.empty(); }
Ans:侷限性:不能直接傳給形參一個字串字面值,並且函式中並沒有修改s,形參應該設定為const引用。
改善:bool is_empty(const string& s) { return s.empty(); }
6.17:編寫一個函式,判斷string物件中是否含有大寫字母。編寫一個函式,把string物件全部都改成小寫形式。在這兩個函式中你使用的形參型別相同嗎?為什麼?
Ans:由於使用的是string物件,前者我形參型別為常量引用,後者為普通引用。由於前者只是判斷是否有大寫字母,不需要修改string物件,所以使用常量,使用引用是為了避免string物件太長,不利於拷貝,後者使用普通引用是由於要將大寫字母轉換成小寫字母,故不能使用常量引用。
6.19:假定有如下宣告,判斷哪個呼叫合法、哪個呼叫不合法。對於不合法的函式呼叫,說明原因。
double calc(double);
int count (const string &, char);
int sum( vector<int>::iterator, vector<int>::iterator, int);
vector<int> vec(10);
(a)calc(23.4 , 55.1); (b) count ("abcda",‘a’ );
(c)calc(66); (d)sum(vec.begin() ,vec.end(), 3.8);
Ans:a)非法呼叫。函式宣告的形參個數只有一個,但是函式呼叫中卻有2個實參,實參與形參要一一對應。
b)合法。函式呼叫中第一個實參是字串常量字面值,第二個實參是一個字元,而函式宣告中形參第一個是常量引用,第二個是char型別,一一對應,型別匹配,故合法。
c)合法。引數個數對應,並且實參是int型別,可以轉換成double型別,初始化形參。
d)合法。引數個數對應,前兩個型別匹配,但是最後一個引數,double型別轉換成int型別,會出現資料丟失。
6.20:引用形參什麼時候應該是常量引用?如果形參應該是常量引用,而我們將其設為了普通引用,會出現什麼情況?
Ans:當函式中形參參與的操作不需要修改引用型別的形參時,就應該使用常量引用。
會出現很多的侷限性,不能將常量引用作為實參去初始化形參,也不能用字串字面值去初始化形參,否則編譯器會報錯。並且也不能將需要型別轉換的物件傳給形參。