练习6.47
改写6.3.2节(第205页)练习中使用递归输出vector内容的程序,使其有条件地输出与执行过程有关信息。例如,每次调用是输出vector对象的大小。分别在打开和关闭调试器的情况下编译并执行这个程序。
解答:
这里具体的程序就不写了,216页有例程可以参考。
在VS中命令行定义宏的方式和linux下命令行有区别,/DXXX,在书中216页中也有提到。
练习6.48
说明下面这个循环的含义,它对assert的使用合理吗?
string s;
while(cin >> s && s != sought){}//空函数体
assert(cin);
解答:
不合理,这里判断的是标准输入是否为空,或者是否读到最末尾。
在while循环中cin已经读完了,已经为空或者到了结尾。
所以,这里的assert肯定会被触发。
练习6.49
什么是候选函数?什么是可行函数?
解答:
【引用】函数匹配的第一步就是选定本次调用对应的重载函数集,集合中的函数称为候选函数。
【引用】从候选函数中选出能被这组实参调用的函数,称为可行函数。
练习6.50
已知有第217页对函数f的声明,对于下面的每一个调用列出可行函数。其中那个函数是最佳匹配?如果调用不合法,是因为没有可匹配的函数还是因为调用具有二义性?
(a) f(2.56, 42);
(b) f(42);
(c) f(42, 0);
(d) f(2.56, 3.14);
解答:
(a) 有二义性。不确定是掉f(double, double = 3.14),还是f(int, int).
(b) 合法,和f (int)匹配
(c) 合法,和f (int, int)匹配
(d) 合法,和f(double, double=3.14)匹配
练习6.51
编写函数f的四个版本,令其个输出一条可以区分的消息。验证上一个练习的答案,如果你回答错了,反复研究本节的内容直到你弄清楚自己错在何处。
解答:
void f(){}
void f(int){}
void f(int, int){}
void f(double, double = 3.14){}
int main(){
f(2.56, 42);
f(42);
f(42, 0);
f(2.56, 3.14);
}