练习6.41
下面的哪个调用是非法的?为什么?哪个调用虽然合法但显然与程序员的初衷不符?为什么?
char *init(int ht, int wd = 80, char bckgrnd = ' ');
(a) init();
(b) init(24,10);
(c) init(14,'*');
- (a) 非法。第一个参数不是默认参数,最少需要一个实参。
- (b) 合法。
- © 合法,但与初衷不符。字符
*
被解释成int
传入到了第二个参数。而初衷是要传给第三个参数。
练习6.42
给make_plural函数的第二个形参赋予默认实参’s’, 利用新版本的函数输出单词success和failure的单数和复数形式。
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
string make_plural(size_t ctr, const string& word, const string& ending = "s")
{
return (ctr > 1) ? word + ending : word;
}
int main()
{
cout << "singual: " << make_plural(1, "success", "es") << " "
<< make_plural(1, "failure") << endl;
cout << "plural : " << make_plural(2, "success", "es") << " "
<< make_plural(2, "failure") << endl;
return 0;
}
练习6.43
你会把下面的哪个声明和定义放在头文件中?哪个放在源文件中?为什么?
(a) inline bool eq(const BigInt&, const BigInt&) {...}
(b) void putValues(int *arr, int size);
全部都放进头文件。(a) 是内联函数,(b) 是声明。
练习6.44
将6.2.2节的isShorter函数改写成内联函数。
inline bool is_shorter(const string &lft, const string &rht)
{
return lft.size() < rht.size();
}
练习6.45
回顾在前面的练习中你编写的那些函数,它们应该是内联函数吗?如果是,将它们改写成内联函数;如果不是,说明原因。
一般来说,内联机制用于优化规模小、流程直接、频繁调用的函数。
练习6.46
能把isShorter函数定义成constexpr函数吗?如果能,将它改写成constxpre函数;如果不能,说明原因。
不能。constexpr函数的返回值类型及所有形参都得是字面值类型。
练习6.47
改写6.3.2节练习中使用递归输出vector内容的程序,使其有条件地输出与执行过程有关的信息。例如,每次调用时输出vector对象的大小。分别在打开和关闭调试器的情况下编译并执行这个程序。
#include <iostream>
#include <vector>
using namespace std;
using Iter = vector<int>::const_iterator;
#define NDEBUG
void print(Iter first, Iter last)
{
#ifndef NDEBUG
cout << "vector size: " << last - first << endl;
#endif
if (first == last)
{
cout << "over!" << endl;
return;
}
cout << *first << " ";
print(++first, last);
}
int main()
{
vector<int> vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
print(vec.cbegin(), vec.cend());
return 0;
}
练习6.48
说明下面这个循环的含义,它对assert的使用合理吗?
string s;
while (cin >> s && s != sought) { } //空函数体
assert(cin);
不合理。从这个程序的意图来看,应该用
assert(s == sought);
练习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)
void f(int, int);
和void f(double, double = 3.14);
是可行函数。该调用具有二义性而不合法。 - (b)
void f(int);
是可行函数。调用合法。 - ©
void f(int, int);
和void f(double, double = 3.14);
是可行函数。void f(int, int);
是最佳匹配。 - (d)
void f(int, int);
和void f(double, double = 3.14);
是可行函数。void f(double, double = 3.14);
是最佳匹配。