《C++ Primer》5th 课后练习 第六章 函数 41~50

练习 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章