本文共 1486 字,大约阅读时间需要 4 分钟。
练习6.16
下面的这个函数虽然合法,但是不算特别有用。指出它的局限性并设法改善。
bool is_empty(string& s) {return s.empty();}
解答:
这里推荐使用常量引用,或者是复制传参。确保原始字符串不会被函数进行不必要的修改。
练习6.17
编写一个函数,判断string对象中是否含有大写字母。编写另一个函数,把string对象全都改写成小写形式。在这两个函数中你使用的形参类型相同吗?为什么?
解答:
#include两个函数的参数类型不同。#include #include 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 <
判断是否有大写字母的函数只需要去遍历字符串就可以了,不需要对字符串有任何改变,所以使用常量引用。
改写成大写字母的需要对原有的字符串进行修改,所以采用了直接引用。
练习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) 如果函数写的合理,当改换成普通引用也不会有什么影响。但当函数质量不能保证的情况下,换成普通引用可能会改变原有量的值,可能会对后面造成影响。
转载地址:http://ywqlb.baihongyu.com/