第六章 6.4节练习 & 6.5.1节练习

练习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;
}


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