練習6.16
下面的這個函數雖然合法,但是不算特別有用。指出它的侷限性並設法改善。
bool is_empty(string& s) {return s.empty();}
解答:
這裏推薦使用常量引用,或者是複製傳參。確保原始字符串不會被函數進行不必要的修改。
練習6.17
編寫一個函數,判斷string對象中是否含有大寫字母。編寫另一個函數,把string對象全都改寫成小寫形式。在這兩個函數中你使用的形參類型相同嗎?爲什麼?
解答:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
bool HasUpper(const string& str){
for (auto i : str){
if (isupper(i))
return true;
}
return false;
}
void ToUpper(string &str){
for (size_t i = 0; i != str.size(); ++i){
str.at(i) = toupper(str.at(i));
}
}
int main(){
string str = "abcDefg";
cout << boolalpha << HasUpper(str) << noboolalpha <<endl;
ToUpper(str);
cout << str << endl;
}
兩個函數的參數類型不同。
判斷是否有大寫字母的函數只需要去遍歷字符串就可以了,不需要對字符串有任何改變,所以使用常量引用。
改寫成大寫字母的需要對原有的字符串進行修改,所以採用了直接引用。
練習6.18
爲下面的函數編寫函數聲明,從給定的名字中推測函數具備的功能。
(a) 名爲compare的函數,返回布爾值,兩個參數都是matrix類的引用。
(b) 名爲change_val的函數,返回vector<int>迭代器,有兩個參數:一個是int,另一個是vector<int>的迭代器。
解答:
(a) bool compare(matrix &, matrix &);
比較兩個矩陣
(b) vector<int> change_val(int, vector<int>);
將容器中的某個值,或者全部值替換成int的值。
練習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);
解答:
(a) 不合法,參數數量不對
(b) 合法
(c) 合法
(d) 合法
練習6.20
引用形參什麼時候應該是常量引用?如果形參應該是常量引用,而我們將其設爲了普通引用,會發生什麼情況?
解答:
(1) 當我們不需要對參數值進行改變的情況下,使用常量引用是高效的。並且,當函數要對其進行修改的時候,程序還會給予程序員提示。
(2) 如果函數寫的合理,當改換成普通引用也不會有什麼影響。但當函數質量不能保證的情況下,換成普通引用可能會改變原有量的值,可能會對後面造成影響。