Skip to content

Latest commit

 

History

History
136 lines (120 loc) · 3.73 KB

复习题.md

File metadata and controls

136 lines (120 loc) · 3.73 KB

第 8 章 函数探幽 复习题

  1. 哪种函数适合定义为内联函数?

函数代码量小,运算量小的适合使用内联函数。

  1. 假设song()函数的原型如下:
void song(const char *name,int times);

a. 如何修改原型,使times的默认值为1?
b. 函数定义需要做哪些修改?
c. 能否为name提供默认值 “O,My Papa”?

void song(const char *name,int times= 1); //a
none //b
void song(const char *name = "o,my Papa",int times = 1); //c
  1. 编写iquote()的重载版本 --- 显示其用双引号括起的参数。编写3个版本,一个用于int参数。一个用于double参数,另一个用于string参数。
#include <iostream>
#include <cstring>
using namespace std;
void iqoute(int n)
{
    cout<<"\""<<n<<endl;
}
void iqoute(double d)
{
    cout<<"\""<<d<<endl;
}
void iqoute(string str)
{
    cout<<"\""<<str<<endl;
}
  1. 下面是一个机构模板:
struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
}
a. 编写一个函数,它将box的结构的引用作为形参,并显示每个成员的值。</br>
b. 编写一个函数,它将box的结构的引用作为形参,并将volume成员设置为其他3边的乘积。
using namespace std;
struct box
{
    char maker[40];
    float height;
    float width;
    float length;
    float volume;
}
// a
void show_box(const box &box_a)
{
    cout << "Maker : "<<box_a.maker<<endl;
    cout << "height : "<<box_a.height<<endl;
    cout << "width : "<<box_a.width<<endl;
    cout << "length : "<<box_a.length<<endl;
    cout << "volume : "<<box_a.volume<<endl;
}
// b
void set_volume(box &box_b)
{
    box_b.volume = box_b.height * box_b.width * box_b.length;
}
  1. 为让函数fill()和show() 使用引用参数,需要对程序清单 7.15 做出哪些修改?

  2. 指出下面每个目标是否可以使用默认参数或函数重载完成,或者这两种方法都无法完成,并提供合适的原型。

a. mass(density,volume) 返回密度为density,体积为volume的物体的质量,而mass(density)返回密度为density,体积为1.0立方米的物体的质量。这些值的类型都为double。

double mass(double density,double volume = 1.0);
overload:
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次。

overload:
void repeat(int times,const char *str);
void repeat(const char *str);

c. average(3,6)返回两个int参数的平均值(int类型),而average(3.0,6.0)返回两个double值的平均值(double类型)。

int average(int a,int b);
double average(double a,double b);

d. mangele("I'm glad to meet you")根据是将值赋给char变量还是char*变量,分别返回字符I和指向字符串“I'm glad to meet you”的指针。

函数的特征标相同,所以不可以

  1. 编写返回两个参数中较大值的函数模板。
template <typename T>
T max(T t1,T t2)
{
    return t1>t2?t1:t2;
}
  1. 给定复习题6的模板和复习题4的box结构,提供一个模板具体化,它接受两个box参数,并返回体积较大的一个。
template <> box max (box b1,box b2)
{
    return b1.volume>b2.volume?b1:b2;
}
  1. 在下述代码(假设这些代码是一个完整程序的一部分)中,v1、v2、v3、v4和v5分别是哪种类型?
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类型