1,内容选自《C++ Primer Plus》(第6版)中文版,2017年1月河北第21次印刷版本
2,文章系笔者学习笔记,若有错误,欢迎指正
3,如有雷同,纯属巧合
8.7 复习题
1.哪种函数适合定义为内联函数?
只有一行代码的小型、非递归函数适合作为内联函数。
2.假设song()函数的原型如下:
void song(const char* name, int times);
a.如何修改原型,使times的默认值为1?
b.函数定义需要做哪些修改?
c.能否为name提供默认值"O. My Papa"?
a. void song(const char* name, int times = 1);
b. 不需要。只有原型包含默认值的信息。
c. 可以,如果保留times的默认值:
void song(const char* name = “O. My Papa”, int times);
3.编写iquote()的重载版本——显示其用双引号括起的参数。编写3个版本:一个用于int参数,一个用于double参数,另一个用于string参数。
//可以使用字符串"\""或字符'"'来打印引号,下面的函数演示了这两种方法。
void iquote(int i)
{
cout << "\"" << i << "\"";
}
void iquote(double d)
{
cout << '"' << d << '"';
}
void iquote(const char *str)
{
cout << "\"" << str << "\"";
}
4.下面是一个结构模板:
struct box{
char maker[40];
float height;
float width;
float length;
float volume;
};
a.请编写一个函数,它将box结构的引用作为参数,并显示每个成员的值。
b.请编写一个函数,它将box结构的引用作为参数,并将volume成员设置为其他3项的乘积。
//a
void show(const box &b)
{
cout << "maker:" << b.maker << " "
<< "height" << b.height << " "
<< "width" << b.width << " "
<< "length" << b.length << " "
<< "volume" << b.volume;
}
//b
void set_volume(box &b)
{
b.volume = b.height * b.width * b.length;
}
5.为让函数fill()和show()使用引用参数,需要对程序清单7.15做哪些修改?
#include <array>
#include <iostream>
#include <string>
const int Seasons = 4;
const std::array<std::string, Seasons> Snames = {
"Spring", "Summer", "Fall", "Winter"};
//首先,将函数原型修改为指针引用.
void fill(std::array<double, Seasons> &pa);
void show(const std::array<double, Seasons> &da);
//注意,show()应使用const,以禁止修改对象.
int main()
{
std::array<double, Seasons> expenses;
//修改fill函数调用
fill(expenses);
show(expenses);
system("PAUSE");
return 0;
}
//函数头修改为引用参数
void fill(std::array<double, Seasons> &pa)
{
using namespace std;
for (int i = 0; i < Seasons; i++)
{
cout << "Enter " << Snames[i] << " expenses: ";
//修改为更简单的pa[i]
cin >> pa[i];
}
}
//函数头修改为引用参数
void show(const std::array<double, Seasons> &da)
{
using namespace std;
double total = 0.0;
cout << "\nEXPENSES\n";
for (int i = 0; i < Seasons; i++)
{
cout << Snames[i] << ":$" << da[i] << endl;
total += da[i];
}
cout << "Total Expenses: $" << total << endl;
}
6.指出下面每个目标是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。
a.mess(density,volume)返回密度为density、体积为volume的物体的重量,而mess(density)返回密度为density、体积为1.0立方米的物体的重量。这些值的类型都为double。
//a.通过为第二个参数提供默认值:
double mess(double density, double volume = 1.0);
也可以通过函数重载: