1. 程式人生 > >練習6.16、6.17、6.19、6.20

練習6.16、6.17、6.19、6.20

urn 編譯器 bcd 有一個 har pty 是否 ons 修改

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