第八章
1.哪种函数适合定义为内联函数?
解释:
一般来说,调用一个函数流程为:当前调用命令的地址被保存下来,程序将跳转到所调用的函数并执行该函数,最后跳转回之前所保存的命令地址。
对于经常需要调用的小函数来说,这大大降低了程序运行效率。所以,新增了内联函数。
关键字inline告诉编译器,任何地方只要调用内联函数,就直接把函数的机器码插入到调用它的地方。这样程序执行更有效率,就好像将内联函数中的语句直接插入到了源代码文件中需要调用该函数的地方一样。
适合于:
只有一行代码的小型,非递归函数适合作为内联函数。
2.假设song()函数的原型如下:
void song(const char *name, int times);
a.如何修改原型,使times的默认值为1?
void song(const char*name, int times = 1);
b.函数定义需要做哪些修改?
没有,只有原型包含默认值的信息。
c.能否为name提供默认值"O. My Papa" ?
是的,如果保留times的默认值
3.编写iquote()的重载版本——显示其用双引号括起的参数。编写3个版本:一个用于int参数,一个用于double参数,另一个用于String参数
void iquote(int n)
{
std::cout << "\"" << n << "\"" << std::endl;
}文章来源地址https://www.toymoban.com/news/detail-456008.html
void iquote(double n)
{
std::cout << "\"" << n << "\"" << std::endl;
}
void iquote(std::string n)
{
std::cout << "\"" << n << "\"" << std::endl;
}
int main() {
iquote(4);
iquote(0.9);
iquote("sfd");
return 0;文章来源:https://www.toymoban.com/news/detail-456008.html
}
4.下面是一个结构模板;
struct box
{
char maker[40];
float height;
float width;
float length;
float volume;
};
a.请编写一个函数,它将box结构的引用作为形参,并显示每个成员的值。
b.请编写一个函数,它将box结构的引用作为形参,并将volume成员设置为其他3边的乘积。
struct box
{
char maker[40];
float height = 20;
float width;
float length;
float volume;
};
void show (box &b)
{
std::cout << b.height << std::endl;
}
void set_volume(box & c)
{
c.volume = c.height * c.width * c.length;
}
int main() {
box c;
show(c);
set_volume(c);
return 0;
}
5.为让函数fill()和show()使用引用形参,需要对程序做哪些修改?
6.指出下面每个目标是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。
函数默认值:
(1)参数默认值必须从右向左依次赋值
(2)函数的默认值不可以重复赋值
a. mass(density, volume)返回密度为density,体积为volume的物体的质量,而mass(density)返回密度为density,体积为1.0立方米的物体的质量。这些值的类型都为double。
//函数默认值
double mass(double density, double volume = 1.0);
//函数重载
double mass(double density, double volume);
double mass(double density);
b.repeat(10, "I'm OK")将指定的字符串显示10次,而repeat(“But you're kind of stupid”)将指定的字符串显示5次。
因为函数必须从右向左提供默认值,因此本题无法使用默认值,只能使用函数重载实现
void repeat(int count, std::string s );
void repeat(std::string s);
c.mangle("I'm glad to meet you")根据是将值赋给char变量还是char*变量,分别返回字符1和指向字符串“I'm mad to gleet you” 的指针。
不能这样做,因为两个版本的特征标将相同
7.编写返回两个参数中较大值的函数模板
template<class T>
T max(const T &t1, const T &t2)
{
return t1 > t2 ? t1 : t2;
}
8.给定复习题6的模板和复习题4的box结构,提供一个模板具体化,它接受两个box参数,并返回体积较大的一个。
//模板的原型声明
template<typename T> T bigger(T, T);
//模板的具体化声明
template<> box bigger<box>(box , box);
//模板函数具体化实现
template<> box bigger<box>(box x, box y)
{
return x.volume > y.volume ? x : y;
}
int main() {
box a;
box b;
a.volume = 10;
b.volume = 20;
std::cout << bigger(a, b).volume;
return 0;
}
9.在下述代码(假定这些代码是一个完整程序的一部分)中,v1,v2,v3,v4和v5分别是哪种类型?
定义:
decltype(exp) varname = value; //根据exp的类型来推测varname的类型和 = 右边无关
如果exp一个左值,或者被括号()包围,那么decltype(exp)的类型就是exp引用,假设exp类型为T,那么decltype(exp)的类型就是T&
int g(int x);
float m = 5.5f;
float& rm = m;
decltype(m) v1 = m;
float
decltype(rm) v2 = m;
float &
decltype((m)) v3 = m;
float &
decltype(g(100)) v4;
int
decltype(2.0 * m) v5;
2.0为double类型,所以为double类型
10.用模板函数来求数组最小值
template<typename T> T max5(T[]);
template<typename T> T max5(T st[])
{
T maxx = st[0];
for (int i = 0; i < 5; i++)
{
maxx = max(st[i], maxx);
}
return maxx;
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
cout << max5(arr);
return 0;
}
11. 编写模板函数maxn(),它以由一个T类型元素组成的数组和一个表示数组元素数目的整数作为参数,并返回数组的最大的元素。该程序使用一个包含6个int元素的数组和一个包含4个double元素的数组来调用该函数。程序还包含一个具体化,它以char指针数组和数组中的指针数量作为参数,并返回最长的字符串的地址。如果有多个这样的字符串,则返回其中第一个字符串的地址。使用由5个字符串指针组成的数组来测试该具体化。
//模板参数的声明和模板的具体化声明
template<typename T> T maxn(T [], int);
template<> char*maxn<char*>(char*[], int);
//定义模板函数
template<typename T> T maxn(T arr[], int length)
{
return arr[length - 1];
}
//定义模板函数
template<> char*maxn<char*>(char *st[], int length)
{
int pos = 0;
for (int i = 0; i < length; i++)
{
if(strlen(st[pos]) < strlen(st[i])) pos = i;
}
return st[pos];
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
char *s[] = {"hello", "world"};
cout << maxn(s, 2);
return 0;
}
到了这里,关于C++primer plus 习题+答案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!