第六章 6.2.3節練習

練習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) 如果函數寫的合理,當改換成普通引用也不會有什麼影響。但當函數質量不能保證的情況下,換成普通引用可能會改變原有量的值,可能會對後面造成影響。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章