练习 6.41 下面的哪个调用是非法的?为什么?哪个调用虽然合法但显然与程序员的初衷不符?为什么?
char *init(int ht, int wd = 80, char bckgrnd = ' ');
(a) init();
(b) init(24,10);
(c) init(14,'*');
- a) 非法,第一个参数没有默认值,调用也未传入值。
- b) 合法。
- c) 合法,参数的类型是
int
而调用者传入char
,显然与调用者的初衷不符。
练习 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(int argc, char **argv)
{
cout << make_plural(1, "success", "es") << endl;
cout << make_plural(3, "success", "es") << endl;
cout << make_plural(1, "failure") << endl;
cout << make_plural(3, "failure") << endl;
return 0;
}
练习 6.43 你会把下面的哪个声明和定义放在头文件中?哪个放在源文件中?为什么?
(a) inline bool eq(const BigInt&, const BigInt&) {...}
(b) void putValues(int *arr, int size);
全部放在头文件中。
因为第一个是内联函数的声明及定义,可以在程序中多次定义,而且要求定义一致,所以放在头文件中保证一致。
第二个是普通函数的声明,一般也放在头文件中。
练习 6.44 将6.2.2节的isShorter
函数改写成内联函数。
inline bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
练习 6.45 回顾在前面的练习中你编写的那些函数,它们应该是内联函数吗?如果是,将它们改写成内联函数;如果不是,说明原因。
一般内联机制用于优化规模小、流程直接、频繁调用的函数,我认为函数体大概在行以内的函数,可以考虑加入内联机制优化。
练习 6.46 能把isShorter
函数定义成constexpr
函数吗?如果能,将它改写成constxpre
函数;如果不能,说明原因。
我认为不能,因为constexpr
函数要求返回类型及所有形参类型都是字面值类型,这与isShorter
的作用不符。
**练习 6.47 **
#include<iostream>
#include<string>
#include<vector>
using namespace std;
#define NDEBUG
void print_vec(vector<int> &vec, vector<int>::iterator p) {
#ifndef NDEBUG
cout << "vector size is: " << vec.size() << endl;
#endif // !NDEBUG
if (p != vec.end())
{
cout << *p << " " << endl;
print_vec(vec, p + 1);
}
else {
cout << endl;
return;
}
}
int main(int argc, char **argv)
{
vector<int> ve{ 1,2,3,4,5,6,7,8 };
print_vec(ve, ve.begin());
return 0;
}
练习 6.48 说明下面这个循环的含义,它对assert的使用合理吗?
string s;
while (cin >> s && s != sought) { } //空函数体
assert(cin);
从输入中找到第一个等于sought的字符串
不合理,按其目的应该使用:
assert(s == sought);
练习 6.49 什么是候选函数?什么是可行函数?
- 候选函数: 某次函数调用中对应的重载函数集中的函数。我认为主要有两个明显特征:1与被调函数重名 2在调用发生时可见。
- 可行函数: 某次函数调用中,可以根据实参形成调用的函数。主要有两个明显特征: 1形参数量与实参相同 2对应的形参与实参类型相同,或实参能转换成形参的类型。
练习 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)
- c) 合法,
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)