练习6.39
说明在下面的每组声明中第二条声明语句是何含义。如果有非法的声明,请指出来。
(a)
int calc(int, int);
int calc(const int, const int);
(b)
int get();
double get();
(c)
int *reset(int *);
double *reset(double*);
解答:
(a)
第二条是计算两个常量整型的数。
不合法,第二条无法和第一条进行区分。
(b)
获得double类型的get()
不合法,不能使用不同的返回值类型对函数进行重载。
(c)
重置一个double类型的数。
合法。
练习6.40
下面的哪个声明是错误的?为什么?
(a) int ff(int a, int b = 0, int c = 0);
(b) char *init(int ht = 24, int wd, char bckgrnd);
解答:
这两个声明都是合法的,但是第二个是不合理的。
第二个函数声明的第一个参数使用了默认实参。
这会让调用的时候有些理解上的问题,是向init传两个参数?还是三个参数?
如书中所说,没有提供实参的话,默认实参才会使用到,所以这里还是需要传递三个参数的,
否则程序无法编译通过。
练习6.41
下面的那个调用是非法的?为什么?哪个调用虽然合法但显然与程序员的初衷不符?为什么?
char *init(int ht, int wd = 80, char bckgrnd = ' ');
(a) init();
(b) init(24, 10);
(c) init (14, '*');
解答:
(a)调用是非法的。这里init函数至少需要传递进去一个参数,而这个调用没有传递参数,ht参数没有得到实参,必然会出现编译错误。
(c)是合法的,但是与初衷不符。这里应该是想将ht置为14, bckgrnd置为‘*’。而结果是,ht为14,wd为‘*’的ASCII码值,bckgrnd还是‘ ’
练习6.42
给make_plural函数的第二个形参赋予默认参数‘s’,利用新版本的函数输出单词success和failure的单数和复数形式。
解答:
#include <iostream>
#include <string>
using namespace std;
string make_plural(size_t ctr, const string &word, const string &ending = "s"){
return (ctr > 1) ? word + ending : word;
}
int main(){
string str1 = "success", str2 = "failure";
cout << make_plural(1, str1, "es") << endl;
cout << make_plural(2, str1, "es") << endl;
cout << make_plural(1, str2) << endl;
cout << make_plural(2, str2) << endl;
}