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:当函数中形参参与的操作不需要修改引用类型的形参时,就应该使用常量引用。
会出现很多的局限性,不能将常量引用作为实参去初始化形参,也不能用字符串字面值去初始化形参,否则编译器会报错。并且也不能将需要类型转换的对象传给形参。