練習6.16、6.17、6.19、6.20
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:當函數中形參參與的操作不需要修改引用類型的形參時,就應該使用常量引用。
會出現很多的局限性,不能將常量引用作為實參去初始化形參,也不能用字符串字面值去初始化形參,否則編譯器會報錯。並且也不能將需要類型轉換的對象傳給形參。
練習6.16、6.17、6.19、6.20