練習6.16、6.17、6.19、6.20

weixin_30588675發表於2020-04-05

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:當函式中形參參與的操作不需要修改引用型別的形參時,就應該使用常量引用。

會出現很多的侷限性,不能將常量引用作為實參去初始化形參,也不能用字串字面值去初始化形參,否則編譯器會報錯。並且也不能將需要型別轉換的物件傳給形參。

轉載於:https://www.cnblogs.com/Dark-King/p/9477050.html