第六章 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) 如果函数写的合理,当改换成普通引用也不会有什么影响。但当函数质量不能保证的情况下,换成普通引用可能会改变原有量的值,可能会对后面造成影响。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值